問題描述
有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<<" ";
}