Codeforces Round #438 C. Qualification Rounds

题意:这题题意也看了我好久orz,就是说给你n个题,k个队伍,以及这k个队伍知道这些题的情况,知道为1,不知道为0(这tm要竖着看)问你能

   不能在这n道题中选出一些题来,被选的题目应满足:每个队伍最多知道这些题的一半。

 

Examples
Input
5 3
1 0 1
1 1 0
1 0 0
1 0 0
1 0 0
Output
NO
Input
3 2
1 0
1 1
0 1
Output
YES

思路:什么最多知道一半啊啊啊啊啊!!我就选两个题目不就好了么,每个队知道一个或者两个都不知道就行了,这样想就一目了然了,然
    而还有一个问题,n比较大不能简单的用暴力,但是注意k比较小,最多只有4,所以我们可以采用二进制枚举的方法,每个队伍的状态
    都是一个二进制数,我们就用两层for循环枚举k位二进制数,判断他们是不是某两个队伍的状态(在这里不用担心会有两个队伍状态
    相同,因为如果状态相同那么他们肯定不满足条件)以及他们与(&)是不是等于0(就是判断在每个位置上是否出现了0),如果满足
    条件,那么便是找到了。

代码:
#include<stdio.h>
#include<string.h>
using namespace std;
const int maxn=20;

int a[maxn];

int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    memset(a,0,sizeof(a));
    for(int i=0;i<n;i++){
        int x,sum=0;
        for(int j=0;j<k;j++){
            scanf("%d",&x);
            sum=sum*2+x;
        }
        if(sum==0){
            printf("YES\n");
            return 0;
        }
        a[sum]=1;
    }
    bool f=0;
    int ma=0;
    for(int i=0;i<k;i++)ma=ma*2+1;
    for(int i=0;i<=ma;i++){
        for(int j=i+1;j<=ma;j++){
            if(a[i]==1&&a[j]==1&&((i&j)==0)){
                f=1;
                break;
            }
        }
        if(f==1)break;
    }
    if(f==1)printf("YES\n");
    else printf("NO\n");
    return 0;
}

posted @ 2017-10-07 12:11  ljy3268  阅读(109)  评论(0编辑  收藏  举报