#D0502. 监控信号
监控信号
题目描述
这是一道交互题。
33DAI 正在接监控信号,一共有 个摄像头需要接入,这些摄像头链分别连接到了 条网线中的某一条(保证 ,且每个摄像头只连接到了一条网线,且每条网线如果连接了摄像头也只会链接一个摄像头)。
现在网线编号从 ,每次你可以挑选其中的不超过 条网线测试(33DAI 买的是一个八口 PoE 交换机),每次测试你都能知道这些网线中有几条连接到了摄像头。
请你在 次询问以内,找到所有连接到了摄像头的网线对应的编号。
交互格式
你的 cin
会读取到交互程序的输出,你的 cout
内容会被交互程序捕捉到。
- 首先交互程序会输出当前的 (你可以通过
cin
得到这个数据)。紧接着会等待你的输出并给出你每次输出的结果。 - 每次你需要输出空格隔开的 个数,表示你希望测试的网线编号,如果你只想测试不超过 条,可以补 凑够八根网线。除了 之外,必须在 以内,且互不相等。
- 如果这 8 个编号刚好正确,交互程序会输出
ok
,你得到ok
时需要结束程序。 - 否则交互程序会先输出
no
,紧接着输出一个整数,表示其中有几条网线正确。
- 如果这 8 个编号刚好正确,交互程序会输出
需要注意的是,你在输出后必须刷新缓冲区。对于 C++
,如果你使用 cin/cout
,你可以使用 cout.flush();
刷新缓冲区。如果你使用 scanf/printf
,你可以使用 fflush(stdout);
刷新缓冲区。
交互例子
8 8
ok
1 2 3 4 5 6 7 8
首先交互器输出 8 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
输出顺序不一定要从小到大。
数据规模与约定
对于 的数据,,。。
- 子任务 1(30 分):保证 。
- 子任务 2(30 分):保证 。
- 子任务 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;
}
相关
在下列比赛中: