CF1039B:交互题+二分

本文解析CF1039B题目的交互式解题思路与代码实现,介绍如何通过二分法和随机猜测策略定位火车位置,特别强调了交互题中的缓存清空技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

CF1039B

题解:

  • 第二次做交互题,对交互题没什么感觉。你要询问系统,所以你cout输入,系统再立刻给你cin答案。交互题格式就在于要清空缓存区,可以在printf输出完之后,加一fflush(stdout);也可以直接使用cout<<endl来输出,endl不仅是换行,还可以直接清空缓存区。

  • 二分询问区间,当火车在[1,n]区间,你询问[l-k,mid+k],因为设备有延迟作用。如果返回Yes,则范围缩小。否则询问另一边

  • 因为区间长度适中大于等于2k,所以当小到一定程度就随机问吧!玄学orz!我选择的区间范围为4k。

 

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k;
string s;
int main(){
	cin>>n>>k;
	srand(time(0));
	ll l = 1,	r = n;
	while(1){ 
		if(r - l <= 4*k){    //随机猜测
			ll ans = rand() % (r - l + 1) + l;
			cout<<ans<<" "<<ans<<endl;
			cin>>s;
			if(s[0] == 'Y' || s[0] == 'B')	return 0;
			else{
				l = max(1ll,l-*k);
				r = min(n,r+*k); //加2*k是因为上一次询问移动了k,但是每有查到结果,所以下一次的得到结果又移动了k。
			}
		}else{
			ll mid = (l + r) >> 1;  //[l,mid];
			cout<<l<<" "<<mid<<endl;
			cin>>s;
			if(s[0] == 'B')	return 0;
			if(s[0] == 'Y'){   //在[l-k,mid+k]
				l = max(1ll,l-k);
				r = min(n,mid+k);
			}else{ 	//[mid+1-k,r+k];
   				l = max(1ll,mid+1-k);
				r = min(n,r+k);
			}
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值