假金幣問題-PKUacm1029-ACM

假金幣

“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;
}


 

發佈了35 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章