题意:
有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。
每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。
而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。
给出所有芯片互相测试的结果,问哪些芯片是好芯片。
思路:
解法1:
因为n最大只有20,容易想到二进制枚举,220=1e6,判断过程最大202=400,一共4e8,在1s的时限下可能有点吃力。
注意到好芯片一定比坏芯片多,因此满足条件的状态就变成5e5了,一共2e8,好像还是挺玄的。
不过只要找到一组满足题意的方案就结束程序,似乎不会搜完所有方案。
反正ac了,不管了。
解法2:
因为好芯片比坏芯片多,而且所有芯片两两相互测试,好芯片测试好芯片的结果一定是好芯片,好芯片测试坏芯片的结果一定是坏芯片,所以对于每个芯片,如果这个芯片被测试的结果为好芯片的次数大于一半,那么它就是好芯片,否则就是坏芯片。
code1(枚举):
#include<bits/stdc++.h>
using namespace std;
const int maxm=25;
int g[maxm][maxm];
signed main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
scanf("%d",&g[i][j]);
}
}
for(int i=0;i<(1<<n);i++){
int x=0,y=0;
for(int j=0;j<n;j++){
if(i>>j&1)x++;
else y++;
}
if(x<=y)continue;
int ok=1;
for(int j=0;j<n;j++){
if(i>>j&1){
for(int k=0;k<n;k++){
if(g[j][k]!=(i>>k&1)){
ok=0;
break;
}
}
if(!ok)break;
}
}
if(ok){
for(int j=0;j<n;j++){
if(i>>j&1){
printf("%d ",j+1);
}
}
return 0;
}
}
return 0;
}
code2:
#include<bits/stdc++.h>
using namespace std;
const int maxm=25;
int a[maxm];
signed main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
int x;
scanf("%d",&x);
a[j]+=x;
}
}
for(int i=1;i<=n;i++){
if(a[i]>n/2){
printf("%d ",i);
}
}
return 0;
}
//http://oj.ecustacm.cn/problem.php?id=1419