码迷,mamicode.com
首页 > 其他好文 > 详细

[Codeforces Round #438][Codeforces 868C. Qualification Rounds]

时间:2018-09-23 22:30:25      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:一个人   ORC   bsp   class   div   get   形式   %s   lan   

题目链接:868C - Qualification Rounds

题目大意:有\(n\)个题目,\(k\)个人,每个人可能做过这\(n\)个题里的若干道,出题方要在这\(n\)个题目里选若干个出来作为一套题。称一套题有趣的当且仅当对于任意一个人,他在这套题里做过的题目数不超过总题数的一半,问是否存在这样的一套题。

题解:设第\(i\)道题有\(p_i\)个人做过,显然当存在有\(p_i =0\)时单独把这道题放入套题里即可。

   若存在\(p_i =1\),设做过这道题的人为\(X\),则只需要找到一道题\(j\),使得\(X\)没做过这道题,这时只要出\(i,j\)这两道题就好了。若没有找到这样的题,则说明\(X\)做过全部的题,必然无解。

   当排除了以上情况后,可以发现有\(p_i\geqslant 2\)恒成立,因此若设套题中的题目个数为\(x\),则有\(\sum p_i\geqslant 2x\)。如果存在一套有趣的题,则对这套题一定有\(\sum p_i\leqslant \frac{kx}{2}\)(每个人最多知道\(\frac{x}{2}\)道题,一共\(k\)个人)。所以在这种情况下,若\(k<4\)则无解,否则一定有\(\sum p_i = 2x\),即\(p_i =2\)。找出两道知道的人不重复的题就好了,否则的话由于任意两道题都会有相同的人知道,一定会导致无解。用二进制的形式记录每道题有哪几个人知道,放入集合中查找就好了。

技术分享图片
#include<bits/stdc++.h>
using namespace std;
#define N 100001
int n,k,a,b,f[N][5],p[N],w[N];
set<int>s;
int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++)
      {
      for(int j=1;j<=k;j++)
        scanf("%d",&f[i][j]),
        w[i]^=f[i][j]<<(j-1),
        p[i]+=f[i][j];
      if(p[i]==0)return printf("YES\n"),0;
      s.insert(w[i]);
      }
    for(int j=0;j<k;j++)
      {
      a=b=0;
      for(int i=1;i<=n;i++)
        {
        if(p[i]==1 && w[i]==1<<j)a=1;
        if(!(w[i]&(1<<j)))b=1;
        }
      if(a)return printf("%s\n",b?"YES":"NO"),0;
      }
    for(auto i:s)if(s.count(15-i))return printf("YES\n"),0;
    return printf("NO\n"),0;
}
View Code

 

[Codeforces Round #438][Codeforces 868C. Qualification Rounds]

标签:一个人   ORC   bsp   class   div   get   形式   %s   lan   

原文地址:https://www.cnblogs.com/DeaphetS/p/9693554.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!