共三种状态:
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; }