zoukankan      html  css  js  c++  java
  • codeforce868c

    C. Qualification Rounds
    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    Snark and Philip are preparing the problemset for the upcoming pre-qualification round for semi-quarter-finals. They have a bank of nproblems, and they want to select any non-empty subset of it as a problemset.

    k experienced teams are participating in the contest. Some of these teams already know some of the problems. To make the contest interesting for them, each of the teams should know at most half of the selected problems.

    Determine if Snark and Philip can make an interesting problemset!

    Input

    The first line contains two integers nk (1 ≤ n ≤ 105, 1 ≤ k ≤ 4) — the number of problems and the number of experienced teams.

    Each of the next n lines contains k integers, each equal to 0 or 1. The j-th number in the i-th line is 1 if j-th team knows i-th problem and 0 otherwise.

    Output

    Print "YES" (quotes for clarity), if it is possible to make an interesting problemset, and "NO" otherwise.

    You can print each character either upper- or lowercase ("YeS" and "yes" are valid when the answer is "YES").

    Examples
    input
    5 3
    1 0 1
    1 1 0
    1 0 0
    1 0 0
    1 0 0
    output
    NO
    input
    3 2
    1 0
    1 1
    0 1
    output
    YES
    Note

    In the first example you can't make any interesting problemset, because the first team knows all problems.

    In the second example you can choose the first and the third problems.

    题意:n个题,m个人,从n个题中挑k道题,使m个人每个人会的题目数不超过k/2。

    输入的意思是:第i行第j列为1,说明第j个人会第i道题,为0说明不会

    结论:k直接取2就行   取大了反倒不好满足

    首先我们先分成两种情况

    k = 1       就看有没有全0行嘛,对吧

    k >= 2      首先考虑p道题满足的情况下的,首先p道题我们就确定这已经是一个稳定的系统了,那么我们再加一行,这一行肯定有至少一个1(否则这道题全是0,就是第一种情况了),p加一行的话肯定某一个人会多对一道题,意思就是,其它人的正确率会下降,但是不会导致p+1这个集合变得不符合题意,但是加1的那一列却有可能导致集合不符合题意。

    所以,直接取k = 2即可,在k=2上面加题反倒可能会使集合可能坏掉

    其次说一下具体实现,一共就最多4个人,一道题,最多也就是2的4次方,16种排列。直接枚举每一种即可,

    用一个ans[16]表示每种情况出现过几次,在输入的时候就能够处理

    附上代码

    #include <iostream>
    using namespace std;
    int arr[16] = {0};
    int main()
    {
        int n,m,i,j,t,temp;
        cin >> n >> m;
        for(i = 0; i < n; ++i)
        {
            temp = 0;
            for(j = 0; j < m; ++j)
            {
                scanf("%d",&t);
                temp |= t<<j;
            }
            arr[temp]++;
        }
        for(i = 0;i < 16; ++i)
        {
            for(j = 0; j < 16; ++j)
            {
                if((i&j) == 0 && arr[i] && arr[j])
                {
                    cout << "YES" << endl;
                    return 0;
                }
            }
        }
        cout << "NO" << endl;
    }
  • 相关阅读:
    D语言中的Range与C#中IEnumreable的区别
    D语言中使用Curl读取网页
    在D语言中如何调用Windows中的COM控件
    D语言反射
    D语言基本类型判断 traits.d
    Struts2 XML验证器
    (十四)Struts2 验证框架
    (十三)Struts2 发送电子邮件
    (十二)Struts2 数据库访问
    (十一)Struts2 文件上传
  • 原文地址:https://www.cnblogs.com/mltang/p/7725500.html
Copyright © 2011-2022 走看看