#D0502. 监控信号

监控信号

题目描述

这是一道交互题。

33DAI 正在接监控信号,一共有 88 个摄像头需要接入,这些摄像头链分别连接到了 xx 条网线中的某一条(保证 x8x\ge 8,且每个摄像头只连接到了一条网线,且每条网线如果连接了摄像头也只会链接一个摄像头)。

现在网线编号从 1x1\sim x,每次你可以挑选其中的不超过 88 条网线测试(33DAI 买的是一个八口 PoE 交换机),每次测试你都能知道这些网线中有几条连接到了摄像头。

请你在 yy 次询问以内,找到所有连接到了摄像头的网线对应的编号。

交互格式

你的 cin 会读取到交互程序的输出,你的 cout 内容会被交互程序捕捉到。

  • 首先交互程序会输出当前的 x,yx,y (你可以通过 cin 得到这个数据)。紧接着会等待你的输出并给出你每次输出的结果。
  • 每次你需要输出空格隔开的 88 个数,表示你希望测试的网线编号,如果你只想测试不超过 88 条,可以补 00 凑够八根网线。除了 00 之外,必须在 1x1\sim x 以内,且互不相等。
    • 如果这 8 个编号刚好正确,交互程序会输出 ok,你得到 ok 时需要结束程序。
    • 否则交互程序会先输出 no,紧接着输出一个整数,表示其中有几条网线正确。

需要注意的是,你在输出后必须刷新缓冲区。对于 C++,如果你使用 cin/cout,你可以使用 cout.flush(); 刷新缓冲区。如果你使用 scanf/printf,你可以使用 fflush(stdout); 刷新缓冲区。

交互例子

8 8
ok
1 2 3 4 5 6 7 8

首先交互器输出 8 8(也就是说你输入的 x,yx,y 就是交互器输出的 8,88,8),显然答案就是 181\sim 8,所以当你输出 181\sim 8 之后,会得到 ok 这个输入。

10 10
no 7
no 7
no 6
no 6
ok
1 2 3 4 5 6 7 8
1 2 3 4 5 6 9 10
1 2 3 4 5 6 7 0
1 2 3 4 5 6 9 0
8 10 1 2 3 4 5 6

输出顺序不一定要从小到大。

数据规模与约定

对于 100%100\% 的数据,8x1048 \le x \le 10^4min(x,x8+64)yx\min(x,\lceil\frac{x}{8}\rceil+64)\le y\le x。。

  • 子任务 1(30 分):保证 y=xy=x
  • 子任务 2(30 分):保证 min(x,x2+16)y\min(x,\lceil\frac{x}{2}\rceil+16)\le y
  • 子任务 3(40 分):没有特殊要求。

例子

下面是本题的 30 分代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int x, y;
    cin >> x >> y;
    vector<int> ans;
    for (int i = 1; i < x; i++)
    {
        cout << i << " 0 0 0 0 0 0 0\n";
        cout.flush(); // 强制刷新缓冲区
        string res;
        int num;
        cin >> res >> num; // res 肯定是 "no"
        if (num == 1)
            ans.push_back(i);
    }
    if (ans.size() != 8)
        ans.push_back(x);
    for (int i = 0; i < ans.size(); i++)
        cout << ans[i] << " ";
    return 0;
}