假币问题POJ2692
生活随笔
收集整理的這篇文章主要介紹了
假币问题POJ2692
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解題思路:在本題中,已經明確說明塞利保證在三次稱量后能夠確定假幣,也就是說,輸入的三組稱量數據有唯一的答案。硬幣有三種狀態:較重的假幣、較輕的假幣、真幣。由于只有1枚假幣,且總共只有12枚銀幣,因此可以對所有的情況進行枚舉。假幣可能是任意一枚,故有12種情況;且假幣可能比真幣重,也可能比真幣輕,故有兩種情況。在這全部的24種情況當中,只有一種情況能夠符合三組稱量數據,這就是所要尋找的答案。
? ? ? ? 假設用0、-1和1表示真幣、較輕假幣和較重假幣的重量。分別計算天平左側與右側的重量,若下面三個條件中有一個不滿足,則說明假設不成立,當前的情況與稱量數據矛盾。
? ? ? ?(1)如果天平左側較重,且稱量結果為up。
? ? ? ?(2)如果天平右側較重,且稱量結果為down。
? ? ? ?(3)如果天平左右兩側重量相同,且稱量結果為even。
具體實現時,需要注意以下兩點。
(1)可以使用字符串存儲稱量數據。題目中并沒有說明一定要使用4枚銀幣進行稱量,由于總共有12枚銀幣,天平的一側最多可以有6枚銀幣。
(2)在枚舉的過程中,一旦發現不滿足條件的情況,可以立即跳出循環,繼而枚舉下一枚銀幣;同樣地,一旦發現符合所有稱量數據的情況,可以立即輸出結果。
#include<stdio.h>int status[12]; char left[3][7],right[3][7],result[3][7];//判斷當前的情況是否滿足條件 bool Balanced() {int i,k,leftw,rightw;for(i = 0; i < 3; i++){leftw = rightw = 0;for(k = 0; k <6 && left[i][k] !=0; k++){leftw += status[left[i][k]-'A'];rightw += status[right[i][k]-'A'];}if(leftw > rightw && result[i][0]!='u') //條件1 return false;if(leftw < rightw && result[i][0]!='d') //條件2 return false;if(leftw == rightw && result[i][0]!='e') //條件3 return false; }return true; } int main() {int i,num;scanf("%d",&num);while(num--){for(i = 0; i < 3; i++)scanf("%s%s%s",left[i],right[i],result[i]);for(i = 0; i < 12; i++)status[i] = 0;for(i = 0; i < 12; i++){status[i] = 1; //第i枚硬幣是較重假幣 if(Balanced()) break;status[i] = -1; //第i枚硬幣是較輕假幣 if(Balanced())break;status[i] = 0; //第i枚硬幣是真幣 }printf("%c is the counterfeit coin and it is %s.\n",i+'A',status[i] > 0?"heavy":"light");}return 0; }?
總結
以上是生活随笔為你收集整理的假币问题POJ2692的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Opencvchina网站:把证件照蓝色
- 下一篇: outlook安全电子邮件实现