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;
}
posted @ 2022-03-31 21:40  ㅤSmartBig  阅读(99)  评论(0)    收藏  举报