Description
有一打(12枚)硬币,其中有且仅有1枚假币,11枚真币,用A~L作为各个硬币的代号,假币可能比真币略轻,也可能略重,现在利用天枰,根据输入的3次称量,找出假币,并输出假币是轻还是重
Input
第一行为用例组数T,每组用例占三行每行表示一次称量结果,一次称量结果由三个字符串组成,前两个字符串等长表示放在天秤两边的硬币编号,第三个字符串表示称量结果,even表示平衡,up表示左端略高,down表示左边略低
Output
对于每组用例,输出假币编号并判断其是轻还是重
Sample Input
1
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
Sample Output
K is the counterfeit coin and it is light.
Solution
记录每个硬币重量与真币的差值,对于结果even的称量,标记两边的硬币表示这些硬币一定不可能是假币,对于up和down的称量,重的一边硬币差值加一,轻的一边差值减一,最后从所有没有被标记的硬币中选取差值绝对值最大的硬币即为假币,而通过其差值的符号即可判断是轻还是重
Code
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int t,flag[13],time[13];
char left[12],right[12],state[6];
int main()
{
scanf("%d",&t);
while(t--)
{
memset(flag,0,sizeof(flag));
memset(time,0,sizeof(time));
for(int k=0;k<3;k++)
{
scanf("%s%s%s",left,right,state);
int len=strlen(left);
if(state[0]=='e')
{
for(int i=0;i<len;i++)
flag[left[i]-'A']=flag[right[i]-'A']=1;
}
else if(state[0]=='u')
{
for(int i=0;i<len;i++)
if(!flag[left[i]-'A'])
time[left[i]-'A']++;
for(int i=0;i<len;i++)
if(!flag[right[i]-'A'])
time[right[i]-'A']--;
}
else if(state[0]=='d')
{
for(int i=0;i<len;i++)
if(!flag[left[i]-'A'])
time[left[i]-'A']--;
for(int i=0;i<len;i++)
if(!flag[right[i]-'A'])
time[right[i]-'A']++;
}
}
int ans=0;
for(int i=0;i<12;i++)
{
if(flag[i])continue;
if(abs(time[ans])<=abs(time[i]))
ans=i;
}
printf("%c is the counterfeit coin and it is ",ans+'A');
if(time[ans]>0)printf("heavy.\n");
else printf("light.\n");
}
return 0;
}