题意:这题题意也看了我好久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
");
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
");
else printf("NO
");
return 0;
}