AT3910 Vacant Seat
思路:
纯纯的二分交互题
那我们如何确定空位的位置呢?
我们第一次需要查询的是 \(n-1\) 即编号最后一个的位置。判断是否是空位 。
然后就是二分 \(0\) 至 \(n-1\) 了。如图:

每次查询 \(mid\) 分类讨论:
如果 \([mid,r]\) 长度为奇数并且 \(r\) 的性别与 \(mid\) 性别不同,或如果 \([mid,r]\) 长度为偶数并且 \(r\) 的性别与 \(mid\) 性别不同相同,那么这 \([mid,r]\) 中有空位,否则没空位。
CODE:
#include<bits/stdc++.h>
using namespace std;
int n,a[1000001];
char s[19];
inline void polling(int mid) {
printf("%d\n",mid);
fflush(stdout);
scanf("%s",s);
if(s[0]=='M') {
a[mid]=1;
} else if(s[0]=='V') {
exit(0);
}
}
int main() {
scanf("%d",&n);
polling(n-1);
int l=0,r=n-1;
while(l<=r) {
int mid=(l+r)>>1;
polling(mid);
if (((r-mid+1)%2==1) == (a[mid]==a[r])) {
r=mid;
} else {
l=mid;
}
}
return 0;
}

浙公网安备 33010602011771号