• Codeforces 549B. Looksery Party[构造]


    B. Looksery Party
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    The Looksery company, consisting of n staff members, is planning another big party. Every employee has his phone number and the phone numbers of his friends in the phone book. Everyone who comes to the party, sends messages to his contacts about how cool it is. At the same time everyone is trying to spend as much time on the fun as possible, so they send messages to everyone without special thinking, moreover, each person even sends a message to himself or herself.

    Igor and Max, Looksery developers, started a dispute on how many messages each person gets. Igor indicates n numbers, the i-th of which indicates how many messages, in his view, the i-th employee is going to take. If Igor guesses correctly at least one of these numbers, he wins, otherwise Max wins.

    You support Max in this debate, so you need, given the contact lists of the employees, to determine whether there is a situation where Igor loses. Specifically, you need to determine which employees should come to the party, and which should not, so after all the visitors send messages to their contacts, each employee received a number of messages that is different from what Igor stated.

    Input

    The first line contains a single integer n (1 ≤ n ≤ 100) — the number of employees of company Looksery.

    Next n lines contain the description of the contact lists of the employees. The i-th of these lines contains a string of length n, consisting of digits zero and one, specifying the contact list of the i-th employee. If the j-th character of the i-th string equals 1, then the j-th employee is in the i-th employee's contact list, otherwise he isn't. It is guaranteed that the i-th character of the i-th line is always equal to 1.

    The last line contains n space-separated integers: a1, a2, ..., an (0 ≤ ai ≤ n), where ai represents the number of messages that the i-th employee should get according to Igor.

    Output

    In the first line print a single integer m — the number of employees who should come to the party so that Igor loses the dispute.

    In the second line print m space-separated integers — the numbers of these employees in an arbitrary order.

    If Igor wins the dispute in any case, print -1.

    If there are multiple possible solutions, print any of them.

    Examples
    input
    3
    101
    010
    001
    0 1 2
    output
    1
    1
    input
    1
    1
    1
    output
    0

    input
    4
    1111
    0101
    1110
    0001
    1 0 1 0
    output
    4
    1 2 3 4
    Note

    In the first sample Igor supposes that the first employee will receive 0 messages. Since he isn't contained in any other contact list he must come to the party in order to receive one message from himself. If he is the only who come to the party then he will receive 1 message, the second employee will receive 0 messages and the third will also receive 1 message. Thereby Igor won't guess any number.

    In the second sample if the single employee comes to the party he receives 1 message and Igor wins, so he shouldn't do it.

    In the third sample the first employee will receive 2 messages, the second — 3, the third — 2, the fourth — 3.


     题意:每个人有个发信息列表,Igor猜每个人收信息多少,你决定谁去是他猜错


    一开始乱想各种算法

    其实直接构造就好了官方题解

    In any cases there is such set of people that if they come on party and send messages to their contacts then each employee receives the number of messages that is different from what Igor pointed. Let's show how to build such set. There are 2 cases.

    There are no zeros among Igor's numbers. So if nobody comes on party then each employee receives 0 messages and, therefore, the desired set is empty.
    There is at least one zero. Suppose Igor thinks that i-th employee will receive 0 messages. Then we should add i-th employee in the desired set. He will send messages to his contacts and will receive 1 message from himself. If we add other employees in the desired set then the number of messages that i-th employee will receive will not decrease so we can remove him from considering. Igor pointed some numbers for people from contact list of i-th employee and because they have already received one message we need to decrease these numbers by one. After that we can consider the same problem but with number of employees equals to n - 1. If the remaining number of employees is equal to 0 then the desired set is built.

    情况1:没有猜0,全不去行了

    情况2:有0,这个人必须去,并且他发信息给所有人,等价于r--;然后不断循环这个操作最多n次

    #include <iostream>
    #include <cstdio>
    #include <algorithm>
    #include <cstring>
    using namespace std;
    const int N=105;
    int n,lst[N][N],a[N],r[N],go[N],flag=0,ans=0;
    char s[N];
    int main(int argc, const char * argv[]) {
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%s",s);
            for(int j=0;j<n;j++)
                if(s[j]=='1'){
                    int &cnt=lst[i][0];
                    lst[i][++cnt]=j+1;
                }
        }
        for(int i=1;i<=n;i++) {scanf("%d",&r[i]);if(r[i]==0) flag=1;}
        if(!flag){printf("0");return 0;}
        
        int tn=n;
        while(tn--){
        for(int i=1;i<=n;i++){
            if(r[i]==0&&go[i]==0){
                go[i]=1; ans++;
                int cnt=lst[i][0];//printf("i %d %d
    ",i,cnt);
                for(int j=1;j<=cnt;j++) r[lst[i][j]]--;
            }
        }
        }
        printf("%d
    ",ans);
        for(int i=1;i<=n;i++) if(go[i]) printf("%d ",i);
        return 0;
    }
  • 相关阅读:
    DIV+CSS布局一行两列问题(Repeater布局)
    JavaScript为DropDownList添加新项
    Indexof的实现
    父类子类构造函数的执行顺序
    微软算法面试题(2)
    Heaven on Earth
    阿里巴巴笔试题马尔科夫(HMM)的特征
    心灵净化启示录
    职场英语:开心工作的十二条秘诀
    MySql错误代码1045的解决方案
  • 原文地址:https://www.cnblogs.com/candy99/p/5877478.html
Copyright © 2020-2023  润新知