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; }