xth的第 12 枚硬币(codevs 1366)

Posted Cola

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了xth的第 12 枚硬币(codevs 1366)相关的知识,希望对你有一定的参考价值。

题目描述 Description

传说 xth 曾经拥有11枚完全相同硬币(你懂得),不过今年呢,rabbit又送了他一
枚硬币。这枚硬币和其他硬币外观相同,只有重量不同,或轻或重。Xth 一不小心,
将这枚特殊的硬币和其他硬币混在了一起。Rabbit 知道后很生气,要他立刻把那枚
硬币找出来,并且还要说出这枚硬币是轻还是重。可怜的 Xth 只有一架普通托盘天
平,并且只能称量三次(每次称量,两边各四枚)。现在全部 12枚硬币编号为
A~L,现给出你三次称量的结果,请你帮 xth 找出那枚不一样的硬币。他一定会感
谢你们滴~~~

输入描述 Input Description

共三行,每行是由空格隔开的两个字符串,分别代表左右两盘的四个硬币,以及一
个单词。’even’表示两侧重量相等,’up’表示右侧轻,’down’表示右侧重。

输出描述 Output Description

一行,一个英文句子,指出那枚不一样的硬币以及它的轻重情况。
X is the counterfeit coin and it is light/heavy. (X表示硬币)

样例输入 Sample Input

ABCD EFGH even 
ABCI EFJK up 
ABIJ EFGH even

样例输出 Sample Output

K is the counterfeit coin and it is light.

数据范围及提示 Data Size & Hint

 

数据保证有且仅有一枚特殊的硬币,无矛盾情况出现。

/*
  找不对等次数最多的硬币 
*/
#include<cstdio>
#include<iostream>
#define M 14
using namespace std;
int f[M],vis[M];
char s1[5],s2[5],s3[5];
int main()
{
    for(int T=1;T<=3;T++)
    {
        cin>>s1>>s2>>s3;
        if(s3[0]==\'e\')
        {
            for(int i=0;i<=3;i++)
            {
                f[s1[i]-\'A\'+1]=f[s2[i]-\'A\'+1]=1;
                vis[s1[i]-\'A\'+1]=vis[s2[i]-\'A\'+1]=0;
            }
        }
        else if(s3[0]==\'u\')
        {
            for(int i=0;i<=3;i++)
            {
                if(f[s1[i]-\'A\'+1]==3)vis[s1[i]-\'A\'+1]++;
                if(!f[s1[i]-\'A\'+1])f[s1[i]-\'A\'+1]=3,vis[s1[i]-\'A\'+1]++;
                if(f[s1[i]-\'A\'+1]==2)f[s1[i]-\'A\'+1]=1;
                if(f[s2[i]-\'A\'+1]==2)vis[s2[i]-\'A\'+1]++;
                if(!f[s2[i]-\'A\'+1])f[s2[i]-\'A\'+1]=2,vis[s2[i]-\'A\'+1]++;
                if(f[s2[i]-\'A\'+1]==3)f[s2[i]-\'A\'+1]=1;
            }
        }
        else
        {
            for(int i=0;i<=3;i++)
            {
                if(f[s1[i]-\'A\'+1]==2)vis[s1[i]-\'A\'+1]++;
                if(!f[s1[i]-\'A\'+1])f[s1[i]-\'A\'+1]=2,vis[s1[i]-\'A\'+1]++;
                if(f[s1[i]-\'A\'+1]==3)f[s1[i]-\'A\'+1]=1;
                if(f[s2[i]-\'A\'+1]==3)vis[s2[i]-\'A\'+1]++;
                if(!f[s2[i]-\'A\'+1])f[s2[i]-\'A\'+1]=3,vis[s2[i]-\'A\'+1]++;
                if(f[s2[i]-\'A\'+1]==2)f[s2[i]-\'A\'+1]=1;
            }
        }
    }
    int tot=0,ans=0;
    for(int i=1;i<=12;i++)
      if(vis[i]>tot)
      {
          tot=vis[i];
          ans=i;
      }
    if(f[ans]==2)printf("%c is the counterfeit coin and it is light.",ans+\'A\'-1);
    else printf("%c is the counterfeit coin and it is heavy.",ans+\'A\'-1);
    return 0;
}
View Code

 

以上是关于xth的第 12 枚硬币(codevs 1366)的主要内容,如果未能解决你的问题,请参考以下文章

xth的旅行(codevs 1450)

codevs1369 xth 砍树(线段树)

12枚硬币,怎么3次称出假币

八枚硬币 有一个是假的 用一个天平秤两次找出那个假的 怎么做

P1146 硬币翻转

luogu P1146 硬币翻转