codeforces 1039B Subway Pursuit【二分+随机】
题目:戳这里
题意:一个点在[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 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 现代计算机视觉入门之:什么是图片特征编码
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· Spring AI + Ollama 实现 deepseek-r1 的API服务和调用
· 数据库服务器 SQL Server 版本升级公告
· 程序员常用高效实用工具推荐,办公效率提升利器!
· C#/.NET/.NET Core技术前沿周刊 | 第 23 期(2025年1.20-1.26)
2017-09-07 UVA-10815 Andy's First Dictionary (非原创)