POJ 1013 Counterfeit Dollar 找假硬币 模拟

来源:互联网 发布:工商总局打击网络传销 编辑:程序博客网 时间:2024/06/13 01:30

题意:多组测试数据,每组三行。

有一打(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;}


原创粉丝点击