poj1029 False coin
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