#N0219. 聪明的质检员【NOIP2023模拟赛T2】

聪明的质检员【NOIP2023模拟赛T2】

题目描述

这是一道交互题。

你是“皮薄馅大”牌餐盘制造厂的质检员。作为一个聪明的质检员,你接到了一个任务:检测你家盘子的质量。

已知你家的盘子从00米的高度摔下不会碎,从N+1N+1米的高度摔下一定会碎,也就是说,我们一开始知道盘子的耐摔度在[0,N][0,N]之间。

你的测试方法是:选定一个整数高度HH,然后把盘子从HH米处扔下来,如果盘子碎了,说明你家盘子的耐摔度在[0,H1][0,H-1]之间,如果没碎,说明你家盘子的耐摔度在[H,N][H,N]之间。

你需要通过若干次测试,把盘子的耐摔度确定成一个长度为00的整数区间。

由于你家的盘子皮薄馅大,生产难度很高,所以盘子很贵,你只拿到了KK个盘子,也就是,盘子碎完你就不能继续测试了。

由于你的领导完美主义,追求极致,所以只让你测试最多MM次。

现在,请你在MM次内测试出这个盘子真正的耐摔度。

输入格式

首先,请你从标准读入里面读入N,K,MN,K,M,参数如题意所示。

然后,你需要通过如下形式与交互库交互:

1:输出一个[1,N][1,N]范围内的正整数给标准输出,然后执行fflush(stdout)

2:从标准输入中读入结果,如果盘子碎了,标准输入会输入到字符串gg,否则会输入到字符串notgg

当你测试的过程中交互库发现已经能确定答案的时候,请输出ans-ans,然后记得执行fflush(stdout)

输出格式

无。

样例输入1

5 1 5
notgg
notgg
gg

样例输出1

1
2
3
-2

样例解释1

你首先读入了5,1,55,1,5三个参数,由于你只有一个盘子,所以只能按顺序询问。

交互库会回答notgg,notgg,gg,当第盘子在高度33碎了,而高度22没碎的时候,我们已经可以确定答案是22了,所以输出了答案2-2

样例输入2

4 2 3
gg
notgg
gg

样例输出2

3
1
2
-1

样例解释2

这次你有22个盘子,你先询问了33米的高度,盘子碎了,因此你得知答案在[0,2][0,2]范围内,你又询问了11,盘子没碎,答案在[1,2][1,2]范围内,接下来你询问了22,盘子碎了,因此你得知答案是11

数据范围

因为出题人的懒惰,本题交互库不是自适应的,而是会预先选好一个答案

Subtask 1(5分):K=1,N=MK=1,N=M

Subtask 2(15分):K=M=10,N1000K=M=10,N\leq 1000

Subtask 3(15分):N100N\leq 100

Subtask 4(10分):K=2,N1000,M=45K=2,N\leq 1000,M=45

Subtask 5(15分):K=3,N1000,M=19K=3,N\leq 1000,M=19

Subtask 6(10分):N1000,K10N\leq 1000,K\leq 10

Subtask 7(30分):无特殊限制。

对于所有数据:N109,K301M40000N\leq 10^9,K\leq 30,1\leq M\leq 40000,给定的MM保证有解。

提示

对于彻底没用过CF式交互的同学,这是一个例子。

int n,k,m;
cin>>n>>k>>m;
int lef=0,rig=n;
for (int i=1;i<=m;i++)
{
    int pos=rand()%n+1;
    cout<<pos<<endl; fflush(stdout);
    string s;
    cin>>s;
    if (s=="gg") rig=min(rig,pos-1); else lef=max(lef,pos);
}
if (lef==rig) cout<<-lef<<endl;
else cout<<"我不会"<<endl;