ブルーブリッジカップ試験問題基礎練習チップテスト(推理)


問題の説明
n(2≦n≦20)ブロックチップがあり、良いものと悪いものがあり、良いチップは悪いチップより多いことが知られている.各チップは他のチップをテストするために使用できます.他のチップをチップでテストすると、テストされたチップが良いか悪いかを正確に与えることができます.一方、悪いチップで他のチップをテストすると、良いか悪いかのテスト結果がランダムに与えられます(すなわち、この結果は被テストチップの実際の良し悪しとは関係ありません).すべてのチップのテスト結果を示し、どのチップが良いチップなのかを尋ねます.
入力フォーマット
入力データの第1の動作は、チップの個数を表す整数nである.2行目からn+1行目n*nのテーブルで、1行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

問題解決の考え方:


チップの善し悪しを判断する鍵は、良いチップが悪いチップより多いことが知られていることである.
2つの観点から判断します.
1、1つのチップが他のチップをテストした結果、良いチップが悪いチップより多い場合、このチップは良いチップである可能性がある.
2、もし1つのチップが半分を超えるチップテストの結果が良いならば、このチップは良いチップかもしれません.
まず、悪いチップに違いないチップを選別し、各チップが良いチップにテストされた回数を記録し、最後にどのチップの良いチップかを判断する.

ACコード:

#include
#include
#include
#include
#include
#include
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>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;in/2)
			cout<