判断硬币题。这道题目没咋知道怎么做,看了其他人的discuss才有了思路。
一,EVEN时,两边都是真币
二,非EVEN时,没上天平的都是真币
三,曾经被认为可能偏重,又出现在偏轻的一方的是真币。
我们可以用一个数组zeros存储一定是真币,即出现在even情况内的那些;另一个数组sus存储对可能是假币的怀疑情况,当出现在up时,左边的硬币sus--,右边的++。down时反过来,这样我们通过判断正负就能判断这个假币是light还是heavy,而被认为可能偏重,又出现在偏轻的一方sus自然会先++,后--恢复成0.
#include<stdio.h> #include<string.h> #define abs(x)( x>=0 ? x :-x) #define max(x,y)(x>y?x:y) int sus[13]; int zeros[13]; int main(){ int t,i,j; scanf("%d",&t); while(t--){ char left[3][6],right[3][6],status[3][6]; memset(sus,0,sizeof(sus)); memset(zeros,0,sizeof(zeros)); for(i=0;i<3;i++){ scanf("%s %s %s",left[i],right[i],status[i]); } for(i=0;i<3;i++){ if(strcmp(status[i],"even")==0){ for(j=0;j<strlen(left[i]);j++){ zeros[left[i][j]-65] = 1; zeros[right[i][j]-65] = 1; } } } for(i=0;i<3;i++){ if(strcmp(status[i],"up")==0){ for(j=0;j<strlen(left[i]);j++){ sus[left[i][j]-65]--; sus[right[i][j]-65]++; } } else if(strcmp(status[i],"down")==0){ for(j=0;j<strlen(left[i]);j++){ sus[right[i][j]-65]--; sus[left[i][j]-65]++; } } } int m =0,maxval = 0; for(i=0;i<13;i++){ if(abs(sus[i])>=maxval && zeros[i]!=1) { maxval = abs(sus[i]); m=i; } } if(sus[m]>0) printf("%c is the counterfeit coin and it is light.\n",m+65); else printf("%c is the counterfeit coin and it is heavy.\n",m+65); } return 0; }
时间: 2024-10-12 15:28:07