///我的思想是设置一个状态数组state,初始时将其全部设置为零,先判断down和up情况, ///若为down则将重的一方每个状态都加一,轻的一方都减一;up时,同理。最后处理even情况, ///将在even中出现的left和right方都设置为零。最后扫描state,找出min和max值,若max的 ///值只有一个,则其所代表的coin重,若min值只有一个,其所代表的coin轻 ///因为只有一个coin有问题,所以只有一个coin状态唯一。 #include<stdio.h> #include<string.h> #define LOCAL char left[3][10],right[3][10],result[3][10]; int state[12]; int decide() { int i,min=100,max=-100; int loc_min,loc_max,times_min=0,times_max=0; for(i=0;i<12;i++) { if(min>state[i]) { min=state[i]; loc_min=i; } if(max<state[i]) { max=state[i]; loc_max=i; } } for(i=0;i<12;i++) { if(state[i]==min)times_min++; if(state[i]==max)times_max++; } if(times_min==1) printf("%c is the counterfeit coin and it is light./n",loc_min+65); if(times_max==1) printf("%c is the counterfeit coin and it is heavy./n",loc_max+65); return 0; } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif int cas; scanf("%d",&cas); while(cas--) { int i,j,len; memset(state,0,sizeof(state)); for(i=0;i<3;i++) { scanf("%s%s%s",left[i],right[i],result[i]); } for(i=0;i<3;i++) { len=strlen(left[i]); if(strcmp(result[i],"up")==0) { for(j=0;j<len;j++) { state[left[i][j]-65]++; state[right[i][j]-65]--; } } if(strcmp(result[i],"down")==0) { for(j=0;j<len;j++) { state[left[i][j]-65]--; state[right[i][j]-65]++; } } } for(i=0;i<3;i++) { len=strlen(left[i]); if(strcmp(result[i],"even")==0) { for(j=0;j<len;j++) { state[left[i][j]-65]=0; state[right[i][j]-65]=0; } } } decide(); } return 0; }