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