假金幣
“Gold Bar”銀行收到可靠消息:在前次的N 個金幣中有一枚重量不同的假金幣(其他金幣的重量都相同)。經濟危機之後他們只有一臺天平可用。用這臺天平,可以稱量出左邊托盤中的物體是輕於、重於或等於右邊托盤中的物體。
爲了分辨出假金幣,銀行職員將所有的金幣編爲1到N號。然後用天平稱量不同的金幣組合,每次仔細記載稱量金幣的編號和結果。
現在要求你編寫一個程序,幫助銀行職員根據稱量記錄來找出假金幣的編號。
輸入:
第一行輸入兩個空格隔開的整數N和K,N是金幣的總數(2<=N<=1000 ) , K是稱量的次數(1<=K<=100)。隨後的2K行記錄稱量的情況和結果,連續兩行記錄一次稱量:第一行首先是Pi (1<=Pi<=N/2),表示兩邊托盤中放置的金幣數目,隨後是左邊托盤中Pi個金幣編號和右邊托盤中Pi個金幣編號,所有的數之間都由空格隔開;第二行用'<','>','='和記錄稱量結果:
-
'<'表示左邊托盤中的金幣比右邊的輕;
-
'>'表示左邊托盤中的金幣比右邊的重;
-
'='表示左右兩邊托盤中的金幣一樣重。
輸出:
輸出假金幣的編號。如果根據稱量紀錄無法確定假金幣,輸出0。
輸入樣例:
5 3
2 1 2 3 4
<
1 1 4
=
1 2 5
=
輸出樣例:
3
#include <stdio.h>
int ids[126][1024];
int op[126];
int n,k;
bool isTrue(int id){
int i;
bool isTrue = false;
for(i=0;i < k;i++){
int j;
bool found;
found = false;
for(j = 1;j<=(ids[i][0]<<1);j++){
if(ids[i][j] == id){
found = true;
break;
}
}
if(found && op[i] == '=' || !found && op[i]!='='){
//如果找到了,並且實驗結果爲相等。
//或者,未找到,且實驗結果不等(即有問題的金幣在當前組中)
//則id編號的金幣一定是爲真的金幣
isTrue = true;
break;
}
}
return isTrue;
}
int main(){
scanf("%d%d",&n,&k); //輸入金幣數和測試數據組數
if(!(2<=n && n <=1000) || !(1 <= k && k <= 100)){
return 1;
}
int i,j;
for(i = 0;i < k;i++){
scanf("%d",&ids[i][0]); //輸出本次實驗每個盤上放置的金幣個數
for(j = 1;j <= (ids[i][0]<<1);j++){
scanf("%d",&ids[i][j]); //依次輸入金幣編號
}
scanf("%*c%c",&op[i]);
}
//從第1個金幣開始,迭代校驗第i個金幣是否爲真
for(i = 1; i <= n ;i++){
if(!isTrue(i)){
//false_id = i;
break;
}
}
printf("%d",i);
return 0;
}