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;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

Codeforces Round #406 (Div. 2):C. Berzerk(记忆化搜索解决博弈问题)

C. Berzerk time limit per test 4 seconds memory limit per test 256 megabytes input standard in...
  • Jaihk662
  • Jaihk662
  • 2017年03月24日 15:23
  • 805

【Codeforces Round 375 (Div 2) E】【欧拉回路Fleury算法 或网络流】One-Way Reform 每条边定向使得最多的点满足入度=出度

E. One-Way Reform time limit per test 2 seconds memory limit per test 256 megabytes ...
  • snowy_smile
  • snowy_smile
  • 2016年10月04日 10:20
  • 738

常见HTTP状态码

主要包含: 1xx:请求收到,继续处理 2xx:操作成功收到,分析、接受 3xx:完成此请求必须进一步处理 4xx:请求包含一个错误语法或不能完成 5xx:服务器执行一个完全有效请求失败 ...
  • u013963737
  • u013963737
  • 2018年01月15日 16:33
  • 7

java基础总结 --- enum枚举的常量相关方法、自动售货机(状态模式)例子

package com.zghw.base.enumx; import java.text.DateFormat; import java.util.Date; /** * 允许程序员为enum实...
  • zghwaicsdn
  • zghwaicsdn
  • 2016年02月11日 18:23
  • 1742

使用 JPQL 和原生 SQL 查询 JPA 实体

JPQL 和 SQL 的主要区别在于,前者处理 JPA 实体,后者直接处理关系数据。作为 Java 开发人员,您可能还有兴趣了解使用 JPQL 与 SQL/JDBC 的不同,无需在 Java 代码中使...
  • vigor512
  • vigor512
  • 2014年06月30日 16:38
  • 468

ios用枚举表示状态,选项,状态码

枚举只是一种常量命名方式,入下列枚举表示链接状态 enum EOCConnectionState:NSInteger{ EOCConnectionStateDisconnected = 1,...
  • chenjin360
  • chenjin360
  • 2017年02月07日 16:09
  • 306

解决Codeforces Round 的一些问题

题目链接   代码链接   A:   考虑对于矩形(x,y,z,t):sum = sigma( sigma( si * sj ) ) x   B:   容易知道能获得的最大价值,把不可能拿到...
  • u012923082
  • u012923082
  • 2013年11月22日 17:53
  • 298

【codeforces 732E】【贪心 map乱搞】

传送门:http://codeforces.com/contest/732/problem/E 描述: E. Sockets time limit per t...
  • guhaiteng
  • guhaiteng
  • 2016年10月22日 15:32
  • 549

深度分析 Java 的枚举类型:枚举的线程安全性及序列化问题

本文作者: 伯乐在线 - HollisChuang 。未经作者许可,禁止转载! 欢迎加入伯乐在线 专栏作者。 写在前面: Java SE5 提供了一种新的类型 Java的枚举类型...
  • wolf_fang
  • wolf_fang
  • 2016年09月25日 20:51
  • 508

codeforces上一种应对大测试数据debug方法

接触codeforces时间不长,也就参加了10场左右。之前有次比赛就出现了wa了一道题,在比赛结束后看测试数据log时,发现出错的那组用例是个超过一万行输入的情况,codeforces上的测试数据无...
  • qq_29070399
  • qq_29070399
  • 2017年02月03日 16:09
  • 776
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Codeforces Round #438 C.Qualification Rounds(状态压缩再枚举状态)
举报原因:
原因补充:

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