本题可采用二分查找来解答,需要回答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;
 }










