藍橋杯 試題 基礎練習 芯片測試(推理)

問題描述

  有n(2≤n≤20)塊芯片,有好有壞,已知好芯片比壞芯片多。
  每個芯片都能用來測試其他芯片。用好芯片測試其他芯片時,能正確給出被測試芯片是好還是壞。而用壞芯片測試其他芯片時,會隨機給出好或是壞的測試結果(即此結果與被測試芯片實際的好壞無關)。
  給出所有芯片的測試結果,問哪些芯片是好芯片。

輸入格式

  輸入數據第一行爲一個整數n,表示芯片個數。
  第二行到第n+1行爲n*n的一張表,每行n個數據。表中的每個數據爲0或1,在這n行中的第i行第j列(1≤i, j≤n)的數據表示用第i塊芯片測試第j塊芯片時得到的測試結果,1表示好,0表示壞,i=j時一律爲1(並不表示該芯片對本身的測試結果。芯片不能對本身進行測試)。

輸出格式

  按從小到大的順序輸出所有好芯片的編號

樣例輸入

3
1 0 1
0 1 0
1 0 1

樣例輸出

1 3

解題思路:

判斷一個芯片是否好壞的關鍵就是一句話:已知好芯片比壞芯片多------>(sum>n/2)

從兩個角度判斷:

1、如果一個芯片測試其他芯片的結果,好芯片比壞芯片多,那麼這個芯片可能是好芯片。

2、如果一個芯片被超過一半的芯片測試結果是好,那麼這個芯片可能是好芯片。

首先篩選掉肯定是壞芯片的芯片,然後記錄每個芯片被測試成好芯片的次數 ,最後判斷哪個芯片的好芯片。

AC代碼:

#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
#include<cmath>
using namespace std;
const int N=22;
int main(){	
	int n;
	cin>>n;
	int a[N][N];
	int good[N]; 
	int k=0;
	for(int i=0;i<n;i++)
	{	
		int sum=0;
		for(int j=0;j<n;j++)
		{
			cin>>a[i][j];
			if(a[i][j])//測試結果是1 
				sum++;
		}
		if(sum>n/2)//如果這個芯片測試的好芯片比壞芯片多,這個芯片纔可能是好芯片,記錄下來
			good[k++]=i; 
	}
	//假設這些可能的好芯片裏面全是好芯片
	int ans[N]={0};//記錄第i個芯片被測試成好芯片的次數 
	for(int i=0;i<k;i++)
		for(int j=0;j<n;j++)
			if(a[good[i]][j]==1)
				ans[j]++;
	for(int i=0;i<n;i++)//如果被測試成好芯片的次數大於一半,就肯定是好芯片 
		if(ans[i]>n/2)
			cout<<i+1<<" ";
} 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章