codeforces 1039B Subway Pursuit【二分+随机】

本文介绍了一种结合二分查找与随机策略的交互式搜索算法,用于在限定次数内找到一个在[1,n]区间内随机移动的目标点。通过不断调整查询范围并引入随机元素,算法能在复杂条件下高效定位目标。

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

题目:戳这里

题意:一个点在[1,n]以内,我们可以进行4500次查询,每次查询之后,该点会向左或向右移动0~k步,请在4500次查询以内找到该点。

解题思路:一边二分,一边随机。

交互题似乎有好多是二分,上次交互题的二分调了好久,这次也是。我出数据水平又很低,所以至今不知道哪些数据可以卡哪些二分的写法,只能改一次交一次。。。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 #include <string>
 5 #include <vector>
 6 #include <map>
 7 #include <cmath>
 8 #include <iostream>
 9 #include <random>
10 #include <ctime>
11 using namespace std;
12 typedef long long ll;
13 const int maxn = 1e6 + 10;
14 char ans[11];
15 bool ask(ll l, ll r)
16 {
17     //printf("$$$$");
18     printf("%lld %lld\n", l, r);
19     fflush(stdout);
20     scanf("%s", ans);
21     if(ans[0] == 'Y')
22     {
23         if(l == r) exit(0);
24         else return 1;
25     }
26     else return 0;
27 }
28 int na[maxn];
29 int main()
30 {
31     ll n, k;
32     srand(time(NULL));
33     scanf("%lld %lld", &n, &k);
34     ll l = 1, r = n;
35     while(l <= r)
36     {
37         ll mid = l + (r - l) / 2;
38         if(ask(l, mid))
39         {
40             r = mid;//注意这点,我的理解是mid可能就是我们要找的点,如果用常规写法r=mid-1会把这个点跳过去
41             //但我试了几个样例,发现在区间不断变化且有随机数的情况下,及时r=mid-1也能找到答案。。
42         }
43         else
44         {
45             l = mid + 1;
46         }
47             l = max(1ll, l - k);
48             r = min(n, r + k);
49             mid = l + rand()%(r - l + 1);
50             ask(mid, mid);
51             l = max(1ll, l - k);
52             r = min(n, r + k);
53     }
54     return 0;
55 }
View Code

 

转载于:https://www.cnblogs.com/zmin/p/9606685.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值