Codeforces Round #438 C Qualification Rounds(暴力+位运算)

来源:互联网 发布:logitech g502 mac 编辑:程序博客网 时间:2024/05/29 02:19

题目链接:点击打开链接

因为k最大为4,所以可以根据二进制转十进制的策略存储所有的题目种类

只需要根据k的值找到一对数,使其表示成二进制之后每个数位上1最多出现一次

暴力一遍即可

AC代码如下:

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int n, k;int problem[16];int trans[] = {1,2,4,8,16};inline int getBit(int n, int p){    int temp = n>>p;    return temp%2;}int solve(int m){    if(problem[0])  return 1;    for(int i=1;i<=m;++i)    {        if(problem[i])        {            for(int j=i+1;j<=m;++j)            {                if(problem[j])                {                    int flag=1;                    for(int t=0;t<k;++t)                        if(getBit(i,t)&&getBit(j,t))                        {                            flag=0;                            break;                        }                    if(flag)     return 1;                }            }        }    }    return 0;}int main(){    ios::sync_with_stdio(0);    cin.tie(0);    while(cin>>n>>k)    {        memset(problem,0,sizeof(problem));        int temp;        for(int i=1;i<=n;++i)        {            temp = 0;            for(int j=0;j<k;++j)            {                int a; cin>>a;                temp += trans[j]*a;            }            problem[temp]++;        }        if(solve(trans[k]-1)) cout<<"YES"<<endl;        else cout<<"NO"<<endl;    }    return 0;}


阅读全文
0 0