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

F - Qualification Rounds CodeForces - 868C 二进制

Codeforces-868C. Qualification Rounds(状压)