共三种状态:
Up:右盘上升,说明右盘可能有轻假币,也可能左盘有重假币。
Down:右盘下降,说明右盘可能有重假币,也可能左盘有轻假币。
Even:右盘与左盘平衡,由于假币有且仅有1枚,则说明此时天枰两边的硬币全为真币
称量硬币的方法是无规律且未知的,但是称量硬币后的结果却只有3个,up、down和 even。且当出现even时,天枰两边的硬币必然都为真币,假币必定在余下的硬币之间(这是因为假币有且只有一枚),那么我们就可以定义一个标记数组 zero[]去标记even时的真币,在以后的处理把他们排除在外。
而唯一难以处理的是up和down的状态,因为假币可能轻可能重,则这两种状态都无法得知究竟假币出现在天枰的哪边。用个jdg数组进行怀疑度统计
ac代码
#include <stdio.h>
#include <math.h>
#include <string.h>
#define N 3
int main()
{
int t,i,j,min,p;
char s[3][15];
int jdg[80],zero[80];
scanf("%d",&t);
while(t--)
{
memset(jdg,0,sizeof(jdg));
memset(zero,0,sizeof(zero));
for(i=0;i<N;i++)
{
scanf("%s %s %s",s[0],s[1],s[2]);
{
if(!strcmp(s[2],"even"))
{
for(j=0;s[0][j]!='\0';j++)
{
zero[s[0][j]]=1;
jdg[s[0][j]]=0;
}
for(j=0;s[1][j]!='\0';j++)
{
zero[s[1][j]]=1;
jdg[s[1][j]]=0;
}
}
else if(!strcmp(s[2],"up"))
{
for(j=0;s[0][j]!='\0';j++)
{
jdg[s[0][j]]++;
}
for(j=0;s[1][j]!='\0';j++)
{
jdg[s[1][j]]--;
}
}
else if(!strcmp(s[2],"down"))
{
for(j=0;s[0][j]!='\0';j++)
{
jdg[s[0][j]]--;
}
for(j=0;s[1][j]!='\0';j++)
{
jdg[s[1][j]]++;
}
}
}
}
min=-1;
p=-1;
for(j=0;j<80;j++)
{
if(!zero[j]&&abs(jdg[j])>min)
{
min=abs(jdg[j]);
p=j;
}
}
if(jdg[p]<0)
printf("%C is the counterfeit coin and it is light.\n",p);
else
printf("%C is the counterfeit coin and it is heavy.\n",p);
}
return 0;
}