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;
}

 

posted @ 2019-02-26 15:40  月光下の魔术师  阅读(18)  评论(0)    收藏  举报