1. 程式人生 > >poj1029 False coin

poj1029 False coin

class 這不 bsp blank 權重 但是 equal ret 編寫一個程序

http://poj.org/problem?id=1029

題目大意:“金條”銀行從可靠的消息來源得知,在他們最後一組N個硬幣中,一枚硬幣是假的,與其他硬幣的重量不同(其他硬幣的重量相等)。在經濟危機之後,他們只有一個簡單的平衡。使用這種平衡,我們可以確定左邊的物體的重量是否小於,大於或等於右邊的物體的重量。為了檢測假幣,銀行職員將所有的硬幣從1到N進行編號,從而將每個硬幣分配給一個唯一的整數標識符。之後,他們開始在左邊的平底鍋和右邊的平底鍋裏放置等量的硬幣,以使各種硬幣的數量增加。仔細記錄了硬幣的標識符和權重的結果。您將編寫一個程序,該程序將幫助銀行職員使用這些權重的結果來確定假硬幣的標識符。輸入文件的第一行包含兩個整數N和K,由空格分隔,其中N為硬幣數量(2<=N<=1000), K為滿足的權重數(1<=K<=100)。下面的2K行描述了所有的權重。第一個數字是Pi (1<=Pi<=N/2),表示放置在左邊和右邊的硬幣中硬幣的數量,然後是放置在左邊盤子裏的硬幣的Pi標識符和放置在右邊盤子裏的硬幣的Pi標識符。所有的數字都用空格隔開。第二行包含以下字符之一:‘<‘、‘>‘或‘=‘。它表示權重的結果:

“<”是指左邊的硬幣的重量小於右邊的硬幣的重量,

>的意思是,左邊的硬幣的重量比右邊的硬幣的重量要大,

“=”意思是左邊的硬幣的重量等於右邊的硬幣的重量。

在輸出文件中寫入錯誤硬幣的標識符,如果它不能被給定權重的結果發現,則輸出0。

也就是說N個硬幣,有一個假硬幣,現在給出了K次測量的結果,每一次的前K個標號的硬幣表示放在左側,後K個標號的硬幣表示放在右側,並且給出了測量結果。如果是等號,表示本次測量的所有硬幣都是真的,如果出現了不等號,那麽假硬幣一定在本次測量的硬幣中。但是這個假硬幣可以是輕一點的,也可能是重一點的,這不確定。

算法思想:設coin[i]表示第i個硬幣的真假,全部初始化為false。首先,如果有稱出是相等的,那麽兩邊的硬幣肯定都是真幣 coin[i]設為true( 兩邊硬幣一樣多,N個裏只有一個是假幣,所以平衡了兩邊肯定都是真幣)。然後把每次不等的情況先記錄下來,由於不知道假硬幣是比真硬幣輕還是重,我們可以分為輕的一端的硬幣,和重的一端的硬幣,分別對應的qCoin[i]++,wCoin[i]++,最後找到coin[i]為false並且對應的qCoin[i]或者是wCoin[i]等於不等號出現的次數nEqual的硬幣,該硬幣就是假硬幣。最後判斷是否只找到了一個假硬幣,找到,輸出編號,否則輸出0。

 1 #include<iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int n,k;
 6     cin>>n>>k;
 7     bool*coin=new bool[n+1];
 8     int *qCoin=new int[n+1];
 9     int *wCoin=new int[n+1];
10     for (int i = 1; i < n+1; i++)
11     {
12         coin[i]=false;
13         qCoin[i]=0
; 14 wCoin[i]=0; 15 } 16 int comareCoinNum,nEqual=0; 17 for (int i = 0; i < k; i++) 18 { 19 cin>>comareCoinNum; 20 int *temp=new int[2*comareCoinNum]; 21 for (int i = 0; i < 2*comareCoinNum; i++) 22 { 23 cin>>temp[i]; 24 } 25 char c; 26 cin>>c; 27 if(c===) 28 { 29 for (int i = 0; i < 2*comareCoinNum; i++) 30 coin[temp[i]]=true; 31 } 32 else if(c==<) 33 { 34 for (int i = 0; i < comareCoinNum; i++) 35 qCoin[temp[i]]++; 36 for (int i = comareCoinNum; i < 2*comareCoinNum; i++) 37 wCoin[temp[i]]++; 38 nEqual++; 39 } 40 else 41 { 42 for (int i = 0; i < comareCoinNum; i++) 43 wCoin[temp[i]]++; 44 for (int i = comareCoinNum; i < 2*comareCoinNum; i++) 45 qCoin[temp[i]]++; 46 nEqual++; 47 } 48 } 49 int fCoin=0,t; 50 for (int i = 1; i < n+1; i++) 51 { 52 if((coin[i]==false) && (nEqual==qCoin[i]||nEqual==wCoin[i])) 53 { 54 fCoin++; 55 t=i; 56 } 57 } 58 if(fCoin==1) 59 cout<<t<<endl; 60 else 61 cout<<0<<endl; 62 return 0; 63 }

poj1029 False coin