• 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;
    }
  • 相关阅读:
    uva1220--树的最大独立集+判重
    UVA12186--树型DP
    HDU4171--bfs+树
    远程调用
    高并发业务
    wireshark
    将java程序打包成exe文件
    将博客搬至CSDN
    Mysql分区
    MogileFS
  • 原文地址:https://www.cnblogs.com/mltang/p/7725500.html
Copyright © 2020-2023  润新知