Codeforces Round #438 C.Qualification Rounds(状态压缩再枚举状态)

原创 2017年10月06日 21:52:03

题目链接:Qualification Rounds
题意:给出n,k。n个题目,k个人,k个人中每个人做过那个题目的关系也给出来。现在问能不能在这n个题目中选出一定数量的题组成一个题集,使得k个人中的任何一个人在这个题集中做过的题不超过题数的一半。

思路:刚开始想到,如果有一题k个人都做过,那么这一题绝对不选,如果有一题k个人都没做过,直接可以输出“YES”,问题在于那些完成的人数>0且< k的题里面,接着就想到了如果选两题就能输出“YES”的话,那么这两题一定没有交集;选3题输出“YES”的话,那么3题中的两题必须没有交集,否则意味着有一个人做过3题中的两题,大于1/2了。选四题,选五题…要输出“YES”,至少都要求存在两个题做过的人没有交集。

所以,只需要判断存不存在两个题,使得两个题做过的人没有交集。由于题目数n高达1e5,n^2遍历铁定超时,而k最大只有4,所以这题关键在于状态压缩再枚举状态。存状态,状态最多只有16种,0000~1111,枚举状态,如果状态存在且作与运算结果为0,证明两个状态没有交集,输出“YES”。

#include <iostream>
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#define Max(a,b) a>b?a:b
#define Min(a,b) a>b?b:a
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long long ll;
int dir[4][2]= {{1,0},{-1,0},{0,1},{0,-1}};
const double eps = 1e-6;
const double Pi = acos(-1.0);
const int INF=0x3f3f3f3f;
const int MOD = 1e9+7;
const int maxn = 1e5+10;
int mat[maxn][4],num[4];
int main(){
    int n,k;
    int state,x;
    int vis[20];
    while(~scanf("%d%d",&n,&k)){
        mem(vis,0);
        for(int i = 0; i < n; i++){
            state = 0;
            for(int j = 0; j < k; j++){
                scanf("%d",&x);
                state += (1 << j) * x;
            }
            vis[state] = 1;
        }
        bool flag = false;
        for(int i = 0; i < 16; i++){
            for(int j = 0; j < 16; j++){
                if(vis[i] && vis[j] && (i & j) == 0){
                    flag = true;
                }
            }
        }
        if(flag) puts("YES");
        else puts("NO");
    }
    return 0;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_33843429/article/details/78167345

Codeforces Round #438 - C. Qualification Rounds (状态压缩)

C. Qualification Rounds time limit per test 2 seconds memory limit per test 256 megabyte...
  • Mr_Treeeee
  • Mr_Treeeee
  • 2017-10-12 20:32:44
  • 85

hdu 4033 状态压缩枚举

/* 看别人的的思路 搜索搜不出来我太挫了 状态压缩枚举+好的位置 */ #include #include #define N 20 int lower[N]; char s[N]; int len...
  • u011483306
  • u011483306
  • 2014-10-10 18:33:00
  • 359

Codeforces Round #438 B. Race Against Time 思路很重要

Have you ever tried to explain to the coordinator, why it is eight hours to the contest and not a si...
  • Little_boy_z
  • Little_boy_z
  • 2017-10-05 20:24:29
  • 235

Codeforces Round #438 (Div. 1 + Div. 2 combined) B. Race Against Time(模拟)

Have you ever tried to explain to the coordinator, why it is eight hours to the contest and not a si...
  • qq_37497322
  • qq_37497322
  • 2017-10-05 17:09:33
  • 276

Codeforces 868F (Codeforces Round #438 F) Yet Another Minimization Problem DP+分治

F. Yet Another Minimization Problem time limit per test 2 seconds memory limit ...
  • sinat_35406909
  • sinat_35406909
  • 2017-10-13 20:58:45
  • 382

【状态压缩 && 思维转换】Codeforces Round #438 868C Qualification Rounds

Problem Description 输入n, k代表有n个问题,k个队伍。接下来输入一个n*k的矩阵,如果为1代表第j个队伍知道第i个题如何做,0代表不知道如何做。你想要找到一个关于这n道题的...
  • bbbbswbq
  • bbbbswbq
  • 2017-10-06 17:01:03
  • 70

Codeforces Round #438 C. Qualification Rounds

DescriptionSnark and Philip are preparing the problemset for the upcoming pre-qualification round fo...
  • so_so_y
  • so_so_y
  • 2017-10-05 20:21:02
  • 166

codeforces round #438 C. Qualification Rounds

传送:http://codeforces.com/contest/868/problem/C 想到用二进制去枚举每一行的状态,若存在两个二进制数相与等于0,则输出yes#include #inclu...
  • wwwlps
  • wwwlps
  • 2017-10-07 12:04:20
  • 60

Codeforces Round #438 C. Qualification Rounds 二进制

Snark and Philip are preparing the problemset for the upcoming pre-qualification round for semi-quar...
  • Little_boy_z
  • Little_boy_z
  • 2017-10-06 11:03:38
  • 80

状态压缩的动态规划

状态压缩的动态规划,简称状压DP,是一种将DP和枚举结合起来的方法,可以说是枚举的一种巧妙的优化。 简单来说,如果我们能够划分状态,但是很难继续细分(或者说是状态中的元素都彼此有关,但没有明显的规律...
  • WenDavidOI
  • WenDavidOI
  • 2016-08-05 18:52:43
  • 861
收藏助手
不良信息举报
您举报文章:Codeforces Round #438 C.Qualification Rounds(状态压缩再枚举状态)
举报原因:
原因补充:

(最多只允许输入30个字)