[交互]人生第一道交互题!洛谷P1947 猜数
洛谷P1947 猜数
题目背景
这是一道交互题。
题目描述
珂愛给了你一个 之间的整数 ,你每次可以询问一个整数 ,然后珂愛会告诉你 和 的大小关系。
你需要用尽可能少的次数猜出珂愛想的数。
你需要实现一个函数 int Chtholly(int n,int c),这个函数的作用是在不超过 次询问中猜对 中的一个数,返回值为你最终确定的数。
你可以调用交互库中一个叫做 Seniorious 的函数,其原型为 int Seniorious(int x),返回值为:
若 ,则返回 。
若,则返回 。
若 ,则返回 。
你调用 Seniorious 函数的次数不超过 才能得到这个点的分数,否则这个点为 分。有关该函数的调用请参考【说明/提示】部分。
输入格式
样例输入中三个数分别为 , , 。这些数据你都无法读取。
输出格式
样例输出中第一个数是你猜的 ,第二个数是你调用 Seniorious 函数的次数。这些数据你不必输出。
输入输出样例
输入
5 5 3
输出
3 0
说明/提示
样例解释
你要猜的 为 。
由于你和珂愛心灵相通,所以在没有调用 Seniorious 的情况下就猜出来了。
数据规模与约定
对于 的数据,保证 。
对于 的数据,保证 ,。
如何氵题
首先,第一道交互题,我并没有选择 IO 交互,因为现在貌似所有大考都是 grader 交互呢。(虽然容易被草过去)
做了这个题目,第一个学会的是 这个东西加在了一个函数的前面,那么说明这个函数是交互函数。
并且,似乎这种题目就是让你写完一个函数,然后返回一个正确的值就ok了。
在完成这个函数的同时,他会给你一些辅助函数,这些函数都是非常有用的(除非你当打 CTF 一样打 OI )。
好的,这个程序我们一行一行分析,首先第一行。
extern "C" int Seniorious(int);
明显,声明一下这个是出题人给的函数,并且这个函数是出题人给的,不是我们完善的,只需要声明就OK了。
好,然后是需要我们完成的函数。
extern "C" int Chtholly(int n,int c){
int left=1,right=n;
while(left<right){
int mid=(left+right)/2;
int pos=Seniorious(mid);
if(pos==0){
return mid;
break;
}
if(pos==1) right=mid-1;
else left=mid+1;
}
return left;
}
下一次开二分搜索的坑。
这里不着重讲二分搜索,主要讲交互题的格式之类的。
首先,声明一下这个函数叫 Chtholly 。我永远爱珂朵莉 然后呢,先定义一个,表示一个区间 。这个区间里应该存的是可以满足条件的数的整个数组。
好,然后这一步非常关键
int pos=Seniorious(mid);
这一步就是说明,我现在来去访问一下你的函数,然后返回一个值,交互交互,这就是向评测姬提问的过程。
然后就是朴素二分的写法,这里不多赘述。
return left;
最后要求的答案是找到的,显然,如果在外部的话,那这个,随便返回一个都ok了。
完结撒花!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通