Counterfeit Dollar
Counterfeit Dollar
http://www.nowcoder.com/questionTerminal/7c4430f6aa2a48f5a817e31d1c26773e
题意就是12个硬币,11真,1假,假币轻或重未知,给出三次称量结果,找出假币。
由于只有1个假币,而且题目说明答案唯一,那么设两个数组light和heavy,分别对应假币轻和假币重的情况。
如果称量结果是even,那么天平左右的硬币均为真;
如果称量结果是up(右边),那么假币轻的情况下左边天平和没称的均为真,假币重的情况下右边天平和没称的均为真;
如果称量结果是down(右边),那么假币轻的情况下右边天平和没称的均为真,假币重的情况下左边天平和没称的均为真。
最终我们得到的light和heavy数组中,必然有且仅有一个数组中仅一个币与其他币不一样(假币为0,真币为1)。按格式输出即可。
#include<stdio.h> #include<string.h> int light[12] = {0}; // 假币轻的情况 int heavy[12] = {0}; // 假币重的情况 char left[13],right[13],res[5]; int main() { int n = 3; while(scanf("%s%s%s",left,right,res) != EOF && n) { int l = strlen(left); int r = strlen(right); if(!strcmp(res,"up")) // 右边轻 { // 假币轻的情况,左边和没称的全为真 for(int i = 0;i<l;i++) light[left[i]-'A'] = 1; for(int i = 0;i<12;i++) { if(!strrchr(left,i+'A') && !strrchr(right,i+'A')) light[i] = 1; } // 假币重的情况,右边和没称的全为真 for(int i = 0;i<r;i++) heavy[right[i]-'A'] = 1; for(int i = 0;i<12;i++) { if(!strrchr(left,i+'A') && !strrchr(right,i+'A')) heavy[i] = 1; } } else if(!strcmp(res,"down")) // 右边重 { // 假币轻的情况,右边和没称的全为真 for(int i = 0;i<r;i++) light[right[i]-'A'] = 1; for(int i = 0;i<12;i++) { if(!strrchr(left,i+'A') && !strrchr(right,i+'A')) light[i] = 1; } // 假币重的情况,左边和没称的全为真 for(int i = 0;i<l;i++) heavy[left[i]-'A'] = 1; for(int i = 0;i<12;i++) { if(!strrchr(left,i+'A') && !strrchr(right,i+'A')) heavy[i] = 1; } } else // 天平两边均为真币 { for(int i = 0;i<l;i++) { light[left[i]-'A'] = 1; heavy[left[i]-'A'] = 1; } for(int i = 0;i<r;i++) { light[right[i]-'A'] = 1; heavy[right[i]-'A'] = 1; } } n --; } int cntl = 0,cnth = 0; // 计数light和heavy中0的个数 int ansl,ansh; //先计数light for(int i = 0;i<12;i++) { if(!light[i]) { ansl = i; cntl++; } if(!heavy[i]) { ansh = i; cnth++; } } if(cntl == 1) // 假币轻 printf("%c is the counterfeit coin and it is light.\n",'A'+ansl); else // 假币重 printf("%c is the counterfeit coin and it is heavy.\n",'A'+ansh); }