原文链接https://www.cnblogs.com/zhouzhendong/p/IOI2018Day1T1.html
题解
首先二分一下,花费2次操作求出第一位的字符。
假设第一个字符是 Y,答案字符串的长度为 i-1 的前缀是 S,我们考虑如何只花费1次询问得到下一个字符。
press(SAA,SAB,SAX,SB) - (i-1)
如果是 0 ,那么下一个字符是 X
如果是 1 ,那么下一个字符是 B
如果是 2 ,那么下一个字符是 A
最后一个字符花费 2次操作暴力询问即可。
这样刚好需要 n+2 次操作。
代码
#include <bits/stdc++.h> #include "combo.h" using namespace std; char c[4]={'A','B','X','Y'}; string guess_sequence(int n){ string ans; if (press("AB")) ans=press("A")?"A":"B"; else ans=press("X")?"X":"Y"; if (n==1) return ans; for (int i=0;i<3;i++) if (c[i]==ans[0]){ swap(c[i],c[3]); break; } for (int i=2;i<n;i++){ int tmp=press(ans+c[0]+c[0]+ans+c[0]+c[1]+ans+c[0]+c[2]+ans+c[1])-(i-1); ans+=c[2-tmp]; } if (press(ans+c[0])==n) ans+=c[0]; else if (press(ans+c[1])==n) ans+=c[1]; else ans+=c[2]; return ans; }