枚举:假币问题
林克有12枚銀幣。其中有11枚真幣和1枚假幣。假幣看起來和真幣沒有區別,但是重量不同。但林克不知道假幣比真幣輕還是重。
于是他向他朋友約珥借了一架天平,用這架天平稱了這些幣三次。
如果用天平稱兩枚硬幣,發現天平平衡,說明兩枚都是真的。如果用一枚真幣與另一枚銀幣比較,發現它比真幣輕或重,說明它是假幣。
經過精心的設計,聰明的林克根據這三次稱量結果找出假幣,并且能夠確定假幣是輕是重。
如果給你林克的稱量數據,你也可以找出假幣并且確定假幣是輕是重嗎?(林克提供的稱量數據保證一定能找出假幣)。
輸入
第一行有一個數字n,表示有n組測試用例。
對于每組測試用例:
輸入有三行,每行表示一次稱量的結果。林克事先將銀幣標號為A-L。
每次稱量的結果用三個以空格隔開的字符串表示:
天平左邊放置的硬幣? 天平右邊放置的硬幣? 平衡狀態。
其中平衡狀態用``up'', ``down'', 或 ``even''表示, 分別為右端高、右端低和平衡。天平左右的硬幣數總是相等的。
1
ABCD EFGH even?
ABCI EFJK up?
ABIJ EFGH even?
輸出
輸出哪一個標號的銀幣是假幣,并說明它比真幣輕還是重(heavy or light)。
每組案例的輸出占一行。
K is the counterfeit coin and it is light.對每種結果進行枚舉即可,看看滿不滿足三個條件。
#include<iostream> #include<cstring> std::string left[3],right[3],result[3];bool test(char ch,bool islight){//light:右端輕 std::string c;c.push_back(ch);//char->string//三個條件int count=0; for(int i=0;i<3;i++){std::string l = left[i];std::string r = right[i];if (islight==false) swap(l,r);//相當于是左端重 交換了,仍然是右端重 switch(result[i][0]){case 'e':{if (l.find(c)!=std::string::npos||r.find(c)!=std::string::npos){//平衡卻找到了假幣 return false;}break;}case 'u':{if (r.find(c)==std::string::npos){//右邊高,但是沒找到 return false;}break;}case 'd':{if (l.find(c)==std::string::npos){//左邊高,但是沒找到return false;}break;} }} return true;//三個都滿足 正常退出 } int main() {int t;std::cin>>t;while(t--){for(int i=0;i<3;i++){std::cin>>left[i]>>right[i]>>result[i];}//開始枚舉for(char ch = 'A';ch<='L';ch++){if (test(ch,true)){//light std::cout<<ch<<" is the counterfeit coin and it is light. "<<std::endl;break;}else if (test(ch,false))//heavy {std::cout<<ch<<" is the counterfeit coin and it is heavy. "<<std::endl;break;}} }return 0;}總結
- 上一篇: 图片尺寸怎么修改?分享2种方法快速修改图
- 下一篇: b B kb kB kbps KBps