题意:多组测试数据,每组三行。
有一打(12枚)硬币,其中有且仅有1枚假币,11枚真币
用A~L作为各个硬币的代号
假币可能比真币略轻,也可能略重
现在利用天枰,根据Input输入的3次称量,找出假币,并输出假币是轻还是重。
思路和 POJ 2418 是一样的。 就不重复了。
#include<iostream>
#include<algorithm>
#include<string>
#include<cstring>
#include<cstdio>
const int maxn=100005;
using namespace std;
int flag[maxn]; //记录硬币真假,1为真
int w[maxn]; //记录硬币出现的次数,轻的和重的要分开记录,为正表示重的出现次数,负表示轻的出现次数
int main()
{
// freopen("E:\\ACM\\test.txt","r",stdin);
int T;
cin>>T;
string a,b,sign;
while(T--)
{
int total=0; //记录不等式出现出现次数
memset(flag,0,sizeof(flag));
memset(w,0,sizeof(w));
for(int i=0;i<3;i++)
{
cin>>a>>b>>sign;
if(sign=="even") //为真
{
for(int i=0;i<a.size();i++)
{
flag[a[i]-'A']=flag[b[i]-'A']=1;
}
}
else if(sign=="up") //右轻左重
{
++total;
for(int i=0;i<a.size();i++) w[a[i]-'A']++;
for(int i=0;i<b.size();i++) w[b[i]-'A']--;
}
else if(sign=="down") //右重左轻
{
++total;
for(int i=0;i<a.size();i++) w[a[i]-'A']--;
for(int i=0;i<b.size();i++) w[b[i]-'A']++;
}
}
char ans;
for(int i=0;i<12;i++)
{
if(flag[i]==0&&(w[i]==total||w[i]==-total)) //找每次都出现的假币
{
ans=i+'A';
w[i]==total?sign="heavy.":sign="light."; //如果w[i]为正,说明硬币是重的
break;
}
}
cout<<ans<<" is the counterfeit coin and it is "<<sign<<endl;
}
return 0;
}