本题可采用二分查找来解答,需要回答n个问题,则结论编号范围为1~2^n,设左边界le=1,右边界ri=2^n,中点mid=(ri+le)/2,当玩家回答为“y”时,将右边界ri更新为mid,当玩家回答为“n”时,将左边界le更新为mid+1。左边界与右边界重合,即le==ri时,玩家恰好回答完n个问题,所得le即为结论编号。
代码如下:
#include<iostream>
#include<cmath>
using namespace std;
int pl[105];
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
char ch;
int ri = pow(2, n), le = 1;
while (le < ri) {
cin >> ch;
int mid = (le + ri) / 2;
if (ch == 'y') {
ri = mid;
}
else {
le = mid + 1;
}
}
pl[i] = le;
}
for (int i = 0; i < m; i++) {
cout << pl[i] << endl;
}
return 0;
}