Codeforces Round #499 (Div. 2) D. Rocket_交互题_二分
第一次作交互题,有点不习惯。
由于序列是循环的,我们可以将一半的机会用于判断当前是否是在说谎,另一半的机会用于二分的判断。
对于判断是否实在说谎,用1判断即可。因为不可能有比1还小的数。
本题虽然非常水,却十分有趣。
Code:
#include<cstring> #include<algorithm> #include<cstdio> #include<iostream> using namespace std; const int maxn = 100; int p[maxn]; int main() { int n, m, x; cin >> m >> n; for(int i = 0;i < n; ++i) { cout << 1 << endl; cout.flush(); cin >> x; if(x == 0) return 0; if(x == 1) p[i] = 1; } int l = 1, r = m; for(int i = 0;; ++i) { int mid = (l + r) >> 1; cout << mid << endl; cout.flush(); cin >> x; if(x == 0 || x == -2) return 0; if(p[i % n] == 0) x = -x; if(x == 1) l = mid + 1; else r = mid - 1; } return 0; }