[loj2863]组合动作

先用两次猜出第一个字符,后面就不会出现这个字符了 (我们假设这个字符是c0,其余三种字符分别是c1、c2和c3) ,然后考虑已知s的前i个字符(不妨就s),来推出后面的字符
询问:s+c1和s+c2,如果不是就是c3了,期望是5/3n次的
询问:s+c1+s+c2+c1+s+c2+c2+s+c2+c3(很神奇)
如果长度是i+2,那么就是c2;如果长度是i+1,那么就是c1;否则就是c3
然而s的长度是4i+7的,当|s|=n-1,是4n+3,需要第一种做法,最多2次
那么最坏的次数是2+n-2+2=n+2次,即题中的上限

 1 #include
 2 #include "combo.h"
 3 using namespace std;
 4 string guess_sequence(int n){
 5     char c[4]={'A','B','X','Y'};
 6     if (press("XY"))
 7         if (press("X"))swap(c[0],c[2]);
 8         else swap(c[0],c[3]);
 9     else
10         if (press("B"))swap(c[0],c[1]);
11     string s;
12     s+=c[0];
13     if (n==1)return s;
14     for(int i=2;i){
15         int k=press(s+c[2]+s+c[3]+c[1]+s+c[3]+c[2]+s+c[3]+c[3]);
16         s+=c[1+(k>=i)+(k>i)];
17     }
18     if (press(s+c[1]+s+c[2])3];
19     else s+=c[(press(s+c[2])==n)+1];
20     return s;
21 }
View Code

 

你可能感兴趣的:([loj2863]组合动作)