zoukankan      html  css  js  c++  java
  • [Codeforces Round #438][Codeforces 868C. Qualification Rounds]

    题目链接:868C - Qualification Rounds

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

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

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

       当排除了以上情况后,可以发现有(p_igeqslant 2)恒成立,因此若设套题中的题目个数为(x),则有(sum p_igeqslant 2x)。如果存在一套有趣的题,则对这套题一定有(sum p_ileqslant 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
    "),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
    ",b?"YES":"NO"),0;
          }
        for(auto i:s)if(s.count(15-i))return printf("YES
    "),0;
        return printf("NO
    "),0;
    }
    View Code
  • 相关阅读:
    5、include为应用指定多个struts配置文件
    4、struts处理流程和action的管理方式
    8、类型转换器
    7、请求参数接收
    UESTC 2014 Summer Training #6 Div.2
    Codeforces Round #FF
    css ul li去除圆点
    css a标签去除下划线
    Axure的热区元件的作用
    结组开发项目(TD学生助手)
  • 原文地址:https://www.cnblogs.com/DeaphetS/p/9693554.html
Copyright © 2011-2022 走看看