题解:P6682 [BalticOI 2020 Day1] 染色
比较简单的交互题,不知道怎么上的紫。
形式化题意,每次你可以询问一个数
首先观察数据
多多少少跟二分带点关系,于是考虑二分答案。
我们假设现在我们已经二分出来一个答案
很显然,我们只需将上一次的询问加上或减去
无论如何,这么想你已经能拿到
最后考虑如何满分,我们发现第一次询问的值可能会影响询问的次数。因为后面如果
我们发现第一次询问的值设为
为什么呢?因为假设初值为
代码简洁易懂,如下。
#include <bits/stdc++.h>
using namespace std;
int t;
bool Query(long long ans){
cout<<"? "<<ans<<endl;
bool f;
cin >> f;
return f;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
long long n;
cin >> n;
long long l = 1, r = n;
long long now = (n + 2) / 3;//now不能是0
Query(now);
while (l <= r) {
long long m = (l + r) >> 1;
if ((now + m < 0 || now + m > n) && now - m < 1) {
now = 1;
Query(now);
now += m;
} else if (now + m > n)
now -= m;
else
now += m;
if (now > n || now < 1){
cout<<"= "<<n<<endl;
return 0;
}
if (Query(now))
r = m - 1;
else
l = m + 1;
}
cout<<"= "<<l<<endl;
return 0;
}