POJ 1013:Counterfeit Dollar
2015-07-30 09:32
323 查看
Counterfeit Dollar
Description
Sally Jones has a dozen Voyageur silver dollars. However, only eleven of the coins are true silver dollars; one coin is counterfeit even though its color and size make it indistinguishable from the real silver dollars. The counterfeit coin has a different weight
from the other coins but Sally does not know if it is heavier or lighter than the real coins.
Happily, Sally has a friend who loans her a very accurate balance scale. The friend will permit Sally three weighings to find the counterfeit coin. For instance, if Sally weighs two coins against each other and the scales balance then she knows these two coins
are true. Now if Sally weighs
one of the true coins against a third coin and the scales do not balance then Sally knows the third coin is counterfeit and she can tell whether it is light or heavy depending on whether the balance on which it is placed goes up or down, respectively.
By choosing her weighings carefully, Sally is able to ensure that she will find the counterfeit coin with exactly three weighings.
Input
The first line of input is an integer n (n > 0) specifying the number of cases to follow. Each case consists of three lines of input, one for each weighing. Sally has identified each of the coins with the letters A--L. Information on a weighing will be given
by two strings of letters and then one of the words ``up'', ``down'', or ``even''. The first string of letters will represent the coins on the left balance; the second string, the coins on the right balance. (Sally will always place the same number of coins
on the right balance as on the left balance.) The word in the third position will tell whether the right side of the balance goes up, down, or remains even.
Output
For each case, the output will identify the counterfeit coin by its letter and tell whether it is heavy or light. The solution will always be uniquely determined.
Sample Input
Sample Output
题意是从A到L的dollar,其中有一个跟他们其它的不同,可能是轻了也可能是重了。给了三个在秤上的关系,要你判断出哪一个是伪造的dollar,是轻是重。
做的时候还WA了几次,但AC之后觉得这个题真是水啊。。。不知道为什么只要自己好不容易A完之后就觉得这个题真的很水,为什么当时没有想到呢?就是这种感觉。
咳咳,因为这个题就A到L之中有问题嘛,数据量太小,导致枚举就OK了。所以从A开始就一个一个试吧,如果在even中的语句里出现了,那就排除它的嫌疑。在up语句中出现了,它的flag加3,代表可能是轻的标记。在down语句中出现了,它自己的flag加4,代表可能是重的标记。
然后对12个砝码标记完之后,有标记为1的排除,标记为7 10 11这样的排除,因为不可能出现一个砝码既轻又重的情况,然后找最独特的那一个就是伪造的砝码了。输出即可。
代码:
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 42028 | Accepted: 13369 |
Sally Jones has a dozen Voyageur silver dollars. However, only eleven of the coins are true silver dollars; one coin is counterfeit even though its color and size make it indistinguishable from the real silver dollars. The counterfeit coin has a different weight
from the other coins but Sally does not know if it is heavier or lighter than the real coins.
Happily, Sally has a friend who loans her a very accurate balance scale. The friend will permit Sally three weighings to find the counterfeit coin. For instance, if Sally weighs two coins against each other and the scales balance then she knows these two coins
are true. Now if Sally weighs
one of the true coins against a third coin and the scales do not balance then Sally knows the third coin is counterfeit and she can tell whether it is light or heavy depending on whether the balance on which it is placed goes up or down, respectively.
By choosing her weighings carefully, Sally is able to ensure that she will find the counterfeit coin with exactly three weighings.
Input
The first line of input is an integer n (n > 0) specifying the number of cases to follow. Each case consists of three lines of input, one for each weighing. Sally has identified each of the coins with the letters A--L. Information on a weighing will be given
by two strings of letters and then one of the words ``up'', ``down'', or ``even''. The first string of letters will represent the coins on the left balance; the second string, the coins on the right balance. (Sally will always place the same number of coins
on the right balance as on the left balance.) The word in the third position will tell whether the right side of the balance goes up, down, or remains even.
Output
For each case, the output will identify the counterfeit coin by its letter and tell whether it is heavy or light. The solution will always be uniquely determined.
Sample Input
1 ABCD EFGH even ABCI EFJK up ABIJ EFGH even
Sample Output
K is the counterfeit coin and it is light.
题意是从A到L的dollar,其中有一个跟他们其它的不同,可能是轻了也可能是重了。给了三个在秤上的关系,要你判断出哪一个是伪造的dollar,是轻是重。
做的时候还WA了几次,但AC之后觉得这个题真是水啊。。。不知道为什么只要自己好不容易A完之后就觉得这个题真的很水,为什么当时没有想到呢?就是这种感觉。
咳咳,因为这个题就A到L之中有问题嘛,数据量太小,导致枚举就OK了。所以从A开始就一个一个试吧,如果在even中的语句里出现了,那就排除它的嫌疑。在up语句中出现了,它的flag加3,代表可能是轻的标记。在down语句中出现了,它自己的flag加4,代表可能是重的标记。
然后对12个砝码标记完之后,有标记为1的排除,标记为7 10 11这样的排除,因为不可能出现一个砝码既轻又重的情况,然后找最独特的那一个就是伪造的砝码了。输出即可。
代码:
#include <iostream> #include <algorithm> #include <cmath> #include <vector> #include <string> #include <cstring> #include <map> using namespace std; int num[15]; int Test,i,j,flag[15],sum=0; string left_s[5],right_s[5],bala[5]; char temp_c; void solve() { if(bala[1]=="up") { for(j=0;j<left_s[1].length();j++) { if(left_s[1][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"heavy."<<endl; return ; } } for(j=0;j<right_s[1].length();j++) { if(right_s[1][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"light."<<endl; return; } } } if(bala[2]=="up") { for(j=0;j<left_s[2].length();j++) { if(left_s[2][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"heavy."<<endl; return; } } for(j=0;j<right_s[2].length();j++) { if(right_s[2][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"light."<<endl; return; } } } if(bala[3]=="up") { for(j=0;j<left_s[3].length();j++) { if(left_s[3][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"heavy."<<endl; return ; } } for(j=0;j<right_s[3].length();j++) { if(right_s[3][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"light."<<endl; return ; } } } if(bala[1]=="down") { for(j=0;j<left_s[1].length();j++) { if(left_s[1][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"light."<<endl; return; } } for(j=0;j<right_s[1].length();j++) { if(right_s[1][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"heavy."<<endl; return ; } } } if(bala[2]=="down") { for(j=0;j<left_s[2].length();j++) { if(left_s[2][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"light."<<endl; return; } } for(j=0;j<right_s[2].length();j++) { if(right_s[2][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"heavy."<<endl; return ; } } } if(bala[3]=="down") { for(j=0;j<left_s[3].length();j++) { if(left_s[3][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"light."<<endl; return; } } for(j=0;j<right_s[3].length();j++) { if(right_s[3][j]==temp_c) { sum=1; cout<<temp_c<<" is the counterfeit coin and it is "; cout<<"heavy."<<endl; return ; } } } } bool pend() { int pend_flag=0; if(bala[1]=="up") { for(j=0;j<left_s[1].length();j++) { if(left_s[1][j]==temp_c) { pend_flag=1; } } for(j=0;j<right_s[1].length();j++) { if(right_s[1][j]==temp_c) { pend_flag=1; } } if(pend_flag==0) return false; } if(bala[2]=="up") { for(j=0;j<left_s[2].length();j++) { if(left_s[2][j]==temp_c) { pend_flag=1; } } for(j=0;j<right_s[2].length();j++) { if(right_s[2][j]==temp_c) { pend_flag=1; } } if(pend_flag==0) return false; } if(bala[3]=="up") { for(j=0;j<left_s[3].length();j++) { if(left_s[3][j]==temp_c) { pend_flag=1; } } for(j=0;j<right_s[3].length();j++) { if(right_s[3][j]==temp_c) { pend_flag=1; } } if(pend_flag==0) return false; } if(bala[1]=="down") { for(j=0;j<left_s[1].length();j++) { if(left_s[1][j]==temp_c) { pend_flag=1; } } for(j=0;j<right_s[1].length();j++) { if(right_s[1][j]==temp_c) { pend_flag=1; } } if(pend_flag==0) return false; } if(bala[2]=="down") { for(j=0;j<left_s[2].length();j++) { if(left_s[2][j]==temp_c) { pend_flag=1; } } for(j=0;j<right_s[2].length();j++) { if(right_s[2][j]==temp_c) { pend_flag=1; } } if(pend_flag==0) return false; } if(bala[3]=="down") { for(j=0;j<left_s[3].length();j++) { if(left_s[3][j]==temp_c) { pend_flag=1; } } for(j=0;j<right_s[3].length();j++) { if(right_s[3][j]==temp_c) { pend_flag=1; } } if(pend_flag==0) return false; } return true; } int main() { cin>>Test; while(Test--) { memset(flag,0,sizeof(flag)); memset(num,0,sizeof(num)); sum=0; for(i=1;i<=3;i++) { cin>>left_s[i]>>right_s[i]>>bala[i]; } for(temp_c='A';temp_c<='L';temp_c++) { if(bala[1]=="even") { for(j=0;j<left_s[1].length();j++) { if(left_s[1][j]==temp_c) { flag[temp_c-'A']=1; break; } } for(j=0;j<right_s[1].length();j++) { if(right_s[1][j]==temp_c) { flag[temp_c-'A']=1; break; } } } if(bala[2]=="even") { for(j=0;j<left_s[2].length();j++) { if(left_s[2][j]==temp_c) { flag[temp_c-'A']=1; break; } } for(j=0;j<right_s[2].length();j++) { if(right_s[2][j]==temp_c) { flag[temp_c-'A']=1; break; } } } if(bala[3]=="even") { for(j=0;j<left_s[3].length();j++) { if(left_s[3][j]==temp_c) { flag[temp_c-'A']=1; break; } } for(j=0;j<right_s[3].length();j++) { if(right_s[3][j]==temp_c) { flag[temp_c-'A']=1; break; } } } if(bala[1]=="up") { for(j=0;j<left_s[1].length();j++) { if(left_s[1][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] += 4; } } for(j=0;j<right_s[1].length();j++) { if(right_s[1][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] += 3; } } } if(bala[2]=="up") { for(j=0;j<left_s[2].length();j++) { if(left_s[2][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] += 4; } } for(j=0;j<right_s[2].length();j++) { if(right_s[2][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] += 3; } } } if(bala[3]=="up") { for(j=0;j<left_s[3].length();j++) { if(left_s[3][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] +=4; } } for(j=0;j<right_s[3].length();j++) { if(right_s[3][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] +=3; } } } if(bala[1]=="down") { for(j=0;j<left_s[1].length();j++) { if(left_s[1][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] +=3; } } for(j=0;j<right_s[1].length();j++) { if(right_s[1][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] +=4; } } } if(bala[2]=="down") { for(j=0;j<left_s[2].length();j++) { if(left_s[2][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] +=3; } } for(j=0;j<right_s[2].length();j++) { if(right_s[2][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] +=4; } } } if(bala[3]=="down") { for(j=0;j<left_s[3].length();j++) { if(left_s[3][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] +=3; } } for(j=0;j<right_s[3].length();j++) { if(right_s[3][j]==temp_c) { if(flag[temp_c-'A']==1) continue; else flag[temp_c-'A'] +=4; } } } } for(temp_c='A';temp_c<='L';temp_c++) { num[flag[temp_c-'A']]++; } for(i=0;i<=12;i++) { if(num[i]==1 && i!=7 && i!=10 && i!=11) { for(temp_c='A';temp_c<='L';temp_c++) { if(flag[temp_c-'A']==i) { if(pend()) { solve(); } } } } } } return 0; }
相关文章推荐
- DataSet、DataTable、Json、List 等各种数据的相互转化
- Federated HDFS+beeline+hiveserver2 遇到的坑
- jquery的图片轮播 模板类型
- error LNK2019: unresolved external symbol _main referenced in function ___tmainCRTStartup
- HTML5 + SOCKET视频传输
- hadoop1.2.1的namenode格式化失败的问题
- 理解javascript中的原型和原型链
- jquery-smartMenu鼠标反键菜单
- 用json实现服务器servlet和安卓客户端的数据交互
- RRDTool(三)--fetch,info
- 实现跨域cookie共享
- transfer-encoding:chunked的含义
- javascript设计模式之Module模块
- html 按钮的三种形式
- Javascript Array操作函数整理
- html编写的过程中,为什么font设置属性的时候,第二个属性不起作用
- 原生js与jQuery实现简单的tab切换特效对比
- Google Protocol Buffer 的使用和原理
- JavaScript学习14:表单处理
- [Leetcode 241, Medium] Different Ways to Add Parentheses