二分+交互

二分交互
题面
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
题意
你每一次输出一个数,电脑内部就会根据预先写的答案然后判断大小。如果你猜的数较大,那么电脑就输入<,相反则输入>。如果相同则输出=。
分析
对于这道交互题目,注意先写输出然后再写输入。
首先我们看到任何电脑给出的答案范围都是1~1e9且为整数,所以我们就想是不是可以直接枚举所有整数然后判断呢?但由于这题目数据很大,这样暴力枚举就会出现超时现象。(备注:一般1s的题目,处理1e6以下都是适当的 1e7还行 1e8就可能会爆。
这时,我们就想怎样高效地枚举答案呢?二分就是一个特别高效的方法(复杂度为以2为底 n的对数)
通过二分出所有可能的答案然后让电脑输入字符,如果输入>,表示你输出的数据太小,可以调整left(二分的左边界)。相反,则调整你的right(二分的右边界)。如果是=就直接退出。
AC代码

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;

int main()
{
	int left=1 ,right=1e9,mid;
	char a;
      while(left<=right){
		mid=left+(right-left)/2;//这样写可以避免mid=(right+left)/2中right+left爆数据
	printf("Q %d\n",mid);
        cout.flush();
        cin >> a;
        if(a =='>') left=mid+1;//减少运行时间
         else if(a =='<')  right=mid-1;//Mid已经判别过了,所以可以减少时间
         else
	      break;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值