CF1019B:交互题+二分

CF1019B

题解:

  • 任意两个人之间相差一个数字,手写模拟一下,可以发现规律。就是相对的两个人之间差值为-2,0,2。
  • 如果n = 4k+2,一定无解。因为它和对面的数字相差2k+1奇数个,根据奇偶相加规律。相对的一定是奇偶性不同。注意题目中说了n只能为偶数,所以n = 4k+1 or 4k+3不用考虑了。
  • 接下来就二分查找相同的数字。两个异号区间之间必定存在0    

代码:

#include <bits/stdc++.h>
using namespace std;
int n;
int Judge(int x){    //判断当前的数比对面的数大还是小
	int x1,x2;
	printf("? %d\n",x);	cout<<endl;
	cin>>x1;
	printf("? %d\n",x+n/2); 	cout<<endl;
	cin>>x2;
	if(x1 == x2){
		printf("! %d\n",x);	cout<<endl;
		exit(0);
	}
	return x1 > x2 ? 1 : -1;
}
int main(){
	scanf("%d",&n);
	if(n % 4){
		printf("! -1\n");
		exit(0);
	}
	int l = 1,	r = 1 + n / 2;   //另一边不用管,对称
	int dl = Judge(l),dr = -dl;   //互逆
	while(l <= r){
		int mid = (l + r) >> 1;
		int tmp = Judge(mid);
		if(dl > 0){   
			if(tmp > 0)	l = mid;
			else r = mid;
		}else{
			if(tmp > 0)	r = mid;
			else 	l = mid;
		}
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值