//
//2353416 2010-11-19 01:19:11 Accepted 1184 C 0 160 VRS//1184 硬币称重 贪心//even就肯定是正常的,凡是出现up或down,问题硬币肯定在几次都轻,或都重的地方//所以它在该情况肯定出现次数最多,创建一个coins数组,记录轻重次数,up的就+1,down就-1,//绝对值最大的就是问题硬币#include<stdio.h>#include<string.h>#include<stdlib.h>
int coins[15];
char lr_Side[2][3][15];void ChangeCoins(int loc,int staMark)
{ if(staMark==0) coins[loc]=10000; else if(staMark==1 && coins[loc]!=10000) coins[loc]++; else if(staMark==2 && coins[loc]!=10000) coins[loc]--;}void ProcessCoins(int lr,int level,int sta)
{ int i; int loc; for(i=0;i<(int)strlen(lr_Side[lr][level]);i++) { loc=lr_Side[lr][level][i]-'A'; if(sta==0) ChangeCoins(loc,sta); else if(sta==lr+1) //这里是利用刚好的关系,简化代码 ChangeCoins(loc,2); else ChangeCoins(loc,1); } return;} int main(){ char status[3][5]; int testcase; int i; int staMark; int min,max; int minLoc,maxLoc; scanf("%d",&testcase); while(testcase--) { memset(coins,0,sizeof(coins)); for(i=0;i<3;i++) scanf("%s %s %s",&lr_Side[0][i],&lr_Side[1][i],&status[i]); for(i=0;i<3;i++) { if(strcmp(status[i],"even\0")==0) staMark=0; else if(strcmp(status[i],"up\0")==0) staMark=1; else staMark=2; ProcessCoins(0,i,staMark); ProcessCoins(1,i,staMark); } min=0;max=0; for(i=0;i<12;i++) { if(coins[i]==10000) continue; else if(coins[i]<min) { min=coins[i]; minLoc=i; } else if(coins[i]>max) { max=coins[i]; maxLoc=i; } else if(coins[i]==min) minLoc=-1; else if(coins[i]==max) maxLoc=-1; } if(minLoc!=-1) printf("%c is the counterfeit coin and it is heavy.\n",'A'+minLoc); else printf("%c is the counterfeit coin and it is light.\n",'A'+maxLoc); } return 0;}