题意: Sally Jones 有12个银币,但只有11个是真的,其中一个假的与真银币重量不同。他用对这些银币称量三次,给出每次称量的结果以及称量的硬币编号。问那个硬币是假的。
分析:用一个数组记录每次的称量结果(初值0),如果不平衡,就对可能轻的一边的所有银币进行-1(表示被怀疑一次),对可能重的一边进行+1(表示被怀疑一次).最后被怀疑次数最多的一定就是假的了。
Source Code:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
int cas;
scanf("%d",&cas);
while(cas--){
char left[3][7],right[3][7],sta[3][7];
int time['L'+1]={0};
bool zero['L'+1]={false};
for(int i=0;i<3;i++)
scanf("%s %s %s",left[i],right[i],sta[i]);
for(int i=0;i<3;i++){
switch(sta[i][0]){
case 'u':{
for(int j=0;left[i][j];j++){
time[left[i][j]]++;
time[right[i][j]]--;
}
break;
}
case 'd':{
for(int j=0;left[i][j];j++){
time[left[i][j]]--;
time[right[i][j]]++;
}
break;
}
case 'e':{
for(int j=0;left[i][j];j++){
zero[left[i][j]]=true;
zero[right[i][j]]=true;
}
break;
}
}
}
int ma=-1;
char c;
for(int i='A';i<='L';i++){
if(zero[i]) continue;
if(ma<abs(time[i])){
ma=abs(time[i]);
c=i;
}
}
printf("%c is the counterfeit coin and it is ",c);
if(time[c]>0) printf("heavy.\n");
else printf("light.\n");
}
return 0;
}