zoukankan      html  css  js  c++  java
  • 2013-2014 ACM-ICPC, NEERC, Southern Subregional Contest Problem D. Grumpy Cat 交互题

    Problem D. Grumpy Cat

    题目连接:

    http://www.codeforces.com/gym/100253

    Description

    This problem is a little bit unusual. Here you are to implement an interaction with a testing system. That
    means that you can make queries and get responses in the online mode. Please be sure to use the stream
    ushing operation after each query's output in order not to leave part of your output in some buer. For
    example, in Ñ++ you've got to use the fflush(stdout) function, in Java  call System.out.flush(),
    and in Pascal  flush(output).
    Fall is coming and it's time to elect a new governor in Cattown. After looking at the results of the past
    elections the citizens decided to nominate a new candidate  Grumpy Cat. They said, all the previous
    governors used to spend the Cattown's budget on their own needs and did nothing helpful for the town.
    Grumpy Cat, they said, can't steal more money than he needs to feed himself.
    The administration of Cattown refused to register Grumpy as a new candidate and it caused a lot of
    discontent. People organized the biggest demonstration in the history of Cattown.
    Your friend Eugene is a correspondent of a local newspaper. He has a work assignment to talk to
    demonstrants to understand their main demands. After talking with several people Eugene realized that
    each demonstrant either wants Grumpy Cat to be the new governor or doesn't want Grumpy Cat to be a
    registered candidate or just wants to take part in the demonstration and doesn't have any requirements
    at all. Let's call these 3 types of people grumpy-lovers, grumpy-haters and grumpy-neutral respectively. It
    is known that there is at least one grumpy-lover and at least one grumpy-hater among the demonstrants.
    Eugene decided to nd a type of each demonstrant. He can choose a group of demonstrants and ask them
    for a number of Grumpy Cat supporters among the group. The people of Cattown don't like journalists,
    reporters and correspondents. Each time Eugene asks a group of people, they proceed as follows:

    1. They talk to each other to understand who is who there. For sure, all grumpy-lovers are counted as
      Grumpy Cat supporters and grumpy-haters are not.
    2. If there are more grumpy-lovers than grumpy-haters in this group, all grumpy-neutrals express
      support of Grumpy Cat at the time of this survey.
    3. If there are more grumpy-haters than grumpy-lovers in this group, all grumpy-neutral people do not
      support Grumpy Cat at the time of this survey.
    4. If there are equal numbers of grumpy-haters and grumpy-lovers in this group, each grumpy-neutral
      demonstrant at the time of this survey decides to support or not to support independently on his
      own account.
    5. After all grumpy-neutral people decide their position regarding Grumpy Cat, somebody tells the
      correspondent the number of supporters.
      A fact that a grumpy-neutral person has supported or hasn't supported Grumpy Cat doesn't aect its
      decision in the future. Eugene can think that the surveys are completely independent.
      Eugene doesn't have much time to do too many surveys. He can do at most ⌊
      2πn
      3
      ⌋ surveys, where π is
      the ratio of a circle's circumference to its diameter and ⌊x⌋ is x rounded down. It seems too dicult for
      him! Help him and write a program to interact with demonstrants to nd the type of each demonstrant.
      Eugene knows that there is at least one grumpy-lover and there is at least one grumpy-hater among the
      demonstrants.

    Input

    To read answers to the queries your program should use standard input.
    The input starts with a line containing a positive integer t  the number of testcases in the test.
    Each testcase starts with a line containing a single integer n (2 ≤ n ≤ 100)  the number of demonstrants.
    The following lines will contain one integer each  the number of Grumpy Cat supporters according to
    the preceding survey.
    The total number of demonstrants in all testcases in the test doesn't exceed 1000

    Output

    The program should use the standard output to print queries. Each query describes a single survey. It
    should contain exactly two lines: the rst line should contain g (1 ≤ g ≤ n)  the number of demonstrants
    in an interviewed group, the second line should contain g distinct positive integer numbers t1, t2, . . . , tg
    (1 ≤ ti ≤ n)  the numbers of the demonstrants in the group. The demonstrants are numbered from 1
    to n.
    After your program found the types of all the demonstrants it should print exactly two lines: the rst line
    should contain the only integer -1, the second line should contain exactly n integer numbers f1, f2, . . . , fn
    (1 ≤ fi ≤ 3), where fi = 1 if the i-th demonstrant is a grumpy-lover, fi = 2 if the i-th demonstrant is a
    grumpy-hater and fi = 3 in case of the i-th demonstrant is grumpy-neutral.
    After the output of each line your program should execute the flush operation. Use single space to
    separate integers in a line. Each line should end with end-of-line.
    The program should write queries for the succeeding testcase after printing two lines described in the
    second paragraph for the previous testcase. The program should terminate normally after the last testcase.

    Sample Input

    2
    3
    2
    1
    0
    5
    0
    3

    Sample Output

    3
    1 2 3
    3
    1 2 3
    1
    2
    -1
    1 2 3
    3
    2 4 3
    3
    5 3 1
    -1
    1 2 3 2 3

    Hint

    题意

    有三种人,一种是兹瓷的人,一种是不兹瓷的人,和一种摇摆不定的人。

    你每次可以询问一个集合,问这个集合的人里面有多少个兹瓷的人。

    摇摆不定的人会哪边人多,兹瓷哪边。如果一样多,就随便回答。

    然后你最多问2n次,让你确定所有人的身份。

    题解:

    先每个人都问一遍,这样你可以把所有人分成两类:兹瓷和摇摆的集合A,不支持和摇摆的集合B。

    然后对于每一个集合A的元素都和集合B的所有人问一遍,如果有一个兹瓷的,说明那个人是兹瓷,否则就是摇摆不定的。

    反之同理。

    代码

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 1005;
    int ans[maxn];
    
    void solve()
    {
        memset(ans,0,sizeof(ans));
        int n;
        scanf("%d",&n);
        vector<int> A;A.clear();
        vector<int> B;B.clear();
        for(int i=1;i<=n;i++)
        {
            printf("1
    %d
    ",i);
            fflush(stdout);
            int x;scanf("%d",&x);
            if(x==1)A.push_back(i);
            else B.push_back(i);
        }
        for(int i=0;i<A.size();i++)
        {
            printf("%d
    ",1+B.size());
            fflush(stdout);
            printf("%d",A[i]);
            fflush(stdout);
            for(int j=0;j<B.size();j++)
            printf(" %d",B[j]),fflush(stdout);
            printf("
    ");
            fflush(stdout);
            int x;scanf("%d",&x);
            if(x==0)ans[A[i]]=3;
            else ans[A[i]]=1;
        }
        for(int i=0;i<B.size();i++)
        {
            printf("%d
    ",1+A.size());
            fflush(stdout);
            printf("%d",B[i]);
            fflush(stdout);
            for(int j=0;j<A.size();j++)
            printf(" %d",A[j]),fflush(stdout);
            printf("
    ");
            fflush(stdout);
            int x;scanf("%d",&x);
            if(x==A.size()+1)ans[B[i]]=3;
            else ans[B[i]]=2;
        }
        printf("-1
    ");fflush(stdout);
        for(int i=1;i<=n;i++)
        {
            if(i==1)printf("%d",ans[i]);
            else printf(" %d",ans[i]);
            fflush(stdout);
        }
        printf("
    ");
        fflush(stdout);
    }
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)solve();
        return 0;
    }
  • 相关阅读:
    介绍一个小工具 Linqer
    wcf系列5天速成——第一天 binding的使用(1)
    wcf系列5天速成——第二天 binding的使用(2)
    wcf系列学习5天速成——第三天 事务的使用
    iptables 使用
    rsync 文件.数据同步
    Nginx打开目录浏览功能
    linux 添加开机启动
    watch 命令
    python 命令行处理
  • 原文地址:https://www.cnblogs.com/qscqesze/p/5775245.html
Copyright © 2011-2022 走看看