题意:多组测试数据,每组三行。
有一打(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; }
