芯片测试(枚举/思维)

题意:

有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
发布了430 篇原创文章 · 获赞 36 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_44178736/article/details/104657281
今日推荐