由于该题必然有确定的判定,所以简单的可以这么想:
设置两个数组: real[12]-标志为真 lh[12]--标志被怀疑
每次称球的时候,如果是"even"则把对应的设置为"真东西",即置为1,
如果是"up"或"donw" 则把表示轻重的数组lh对应的 ++ 或者 --,直到最后。
然后把所有对应real中为1(即就是真东西啦)的lh置为0;那么操作之后,
lh中存在没有辨认出真的,就是一系列的例如: -1,-2,1,2,3等数值,那么
假东西就是其中绝对值最大的那个!!------被怀疑次数最多,所以它为假。
#include<stdio.h>
#include<string.h>
#include<math.h>
char s1[30];
char s2[30];
char str[30];
bool v[30];
int num[30];
int main()
{
int cas;
int i,j,max;
int k;
int ans;
scanf("%d%*c",&cas);
while(cas--)
{
memset(v,false,sizeof(v));
memset(num,0,sizeof(num));
for(i=0;i<3;i++)
{
memset(s1,0,sizeof(s1));
memset(s2,0,sizeof(s2));
memset(str,0,sizeof(str));
scanf("%s",s1);
scanf("%s",s2);
scanf("%s",str);
if(strcmp(str,"even")==0)
{
for(j=0;s1[j]!='\0';j++)
v[s1[j]-'A']=true;
for(j=0;s2[j]!='\0';j++)
v[s2[j]-'A']=true;
}
else if(strcmp(str,"up")==0)
{
for(j=0;s1[j]!='\0';j++)
num[s1[j]-'A']++;
for(j=0;s2[j]!='\0';j++)
num[s2[j]-'A']--;
}
else if(strcmp(str,"down")==0)
{
for(j=0;s1[j]!='\0';j++)
num[s1[j]-'A']--;
for(j=0;s2[j]!='\0';j++)
num[s2[j]-'A']++;
}
}
max=-1;
for(i=0;i<12;i++)
if(abs(num[i])>max&&v[i]==false)
{
max=abs(num[i]);
k=i;
}
if(num[k]>0)
printf("%c is the counterfeit coin and it is heavy.\n",k+'A');
else if(num[k]<0)
printf("%c is the counterfeit coin and it is light.\n",k+'A');
}
return 0;
}