交互题 1000ms 256MiB

监控信号

该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。

题目描述

这是一道交互题。

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;
}

【三三信奥】2025 练习赛 2

未参加
状态
已结束
规则
IOI
题目
7
开始于
2025-7-25 9:00
结束于
2025-7-28 19:00
持续时间
3 小时
主持人
参赛人数
83