原题链接:http://codeforces.com/problemset/problem/868/C
题意:有k个队伍参加比赛,比赛有n个预选的题目,有些队伍对已经事先知道了一些题目。问能不能选出若干个题,使没有队伍提前知道了半数以上的比赛题目。
思路:可以肯定的是,只要存在满足条件的选题方案,必定存在两道题,选上这两道之后也是满足条件的。因为k<=4,我们可以用二进制数记录题目的被提前知道的情况。所以,只要存在两个题目,对应的二进制数的异或结果为0,输出YES,否则输出NO。具体实现参看代码
AC代码:
#include<iostream> #include<cstring> #include<cstdio> using namespace std; int num[32]; int main() { int n,k; int m,p; scanf("%d %d", &n, &k); for(int i=0;i<n;i++){ p=0; for(int j=0;j<k;j++){ scanf("%d", &m); p^=m; p<<=1; } //cout<<p<<endl; num[p]++; } p=0; for(int i=0;i<k;i++){ p=p^1; p<<=1; } bool flag=0; //cout<<int(2^15)<<endl; if(num[0]) flag=1; for(int i=1;i<=p;i++){ for(int j=1;j<=p;j++){ if(!(i&j)&&(num[i]&&num[j])){ flag=1; break; } } } if(flag) printf("YES "); else printf("NO "); }