C. Qualification Rounds(状压&思维)
Posted Harris-H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C. Qualification Rounds(状压&思维)相关的知识,希望对你有一定的参考价值。
C. Qualification Rounds(状压&思维)
若有解最多选两个。
选奇数肯定没有选偶数优,在奇数的基础上减少一个1最多的问题是更优的。
所以只需考虑偶数情况。
假设存在4个问题满足,则可以从中选2个也满足。
这样考虑,我们先按照第一位为1的分为一组,为0的分为另一组。
我们关注为0的那一组,若后面3位都是 0- 1 互补,则选这一组的两个即可。
若不互补 ,根据条件必然第一组肯定有与第二组的某一个互补的情况。这个严格证明,不太会。不过可以爆搜证明,枚举所有情况。
所以我们最多选2个。
因为 k = 4 k=4 k=4,考虑状压一下,然后枚举状态即可。
// Problem: C. Qualification Rounds
// Contest: Codeforces - Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined)
// URL: https://codeforces.ml/problemset/problem/868/C
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// Date: 2021-08-11 10:13:18
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=1e3+5,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define ios ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\\n",a[n]);
}
int a[17];
int main(){
int n,k;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
int y=0;
for(int j=0,x;j<k;j++){
scanf("%d",&x);
y+=x<<j;
}
a[y]=1;
}
int st=1<<k;
for(int i=0;i<st;i++)
for(int j=0;j<st;j++)
if(!(i&j)&&a[i]&&a[j]) return puts("YES"),0;
return puts("NO"),0;
}
以上是关于C. Qualification Rounds(状压&思维)的主要内容,如果未能解决你的问题,请参考以下文章
codeforces 868C Qualification Rounds
Codeforces 868C Qualification Rounds - 位运算
codeforces 868C - Qualification Rounds(构造)
Codeforces868C. Qualification Rounds