每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
给出所有芯片的测试结果,问哪些芯片是好芯片。
第二行到第n+1行为n*n的一张表,每行n个数据。表中的每个数据为0或1,在这n行中的第i行第j列(1≤i, j≤n)的数据表示用第i块芯片测试第j块芯片时得到的测试结果,1表示好,0表示坏,i=j时一律为1(并不表示该芯片对本身的测试结果。芯片不能对本身进行测试)。
1 0 1
0 1 0
1 0 1
#include <stdio.h>
#include <memory.h>
int main(int argc, char ** argv){
int i, j, result = 0;
int n, count = 0;
int num[21][21];
int memory[21];
memset(memory, 0, sizeof(memory));
scanf("%d", &n);
for (i = 0; i < n; i++) {
for (j = 0; j < n; j++) {
scanf("%d", &num[i][j]);
}
}
for (i = 0, j = 0; i < n; i++) {
if(num[i][0] == 1){
count++;
}else{
memory[j++] = i;
}
}
while (count < (n+1)/2) {
count = 0;
result = --j;
for (i = 0; i < n; i++) {
if(num[i][memory[j]] == 1){
count++;
}
}
}
for (i = 0; i < n; i++) {
if (num[result][i] == 1) {
printf("%d ", i+1);
}
}
return 0;
}
/*
总结:
1.首先知道一个结论:任取任意一个芯片,用其他所有的芯片来测试这个芯片,如果证明这个芯片为好的芯片的个数超过芯片个数的一半,则这个为好的芯片。否则,这个芯片的为坏的,证明这个芯片为坏的芯片中,肯定有好的芯片,因此从这些芯片中选取一个芯片,用其他所有芯片来测试这个芯片,直到找到好芯片为止。
2.这道题只需要知道一个好的芯片即可,因此转化为找一个好的芯片。
*/