[loj2863]组合动作
Posted pywbktda
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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<bits/stdc++.h> 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<n;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])<n)s+=c[3]; 19 else s+=c[(press(s+c[2])==n)+1]; 20 return s; 21
以上是关于[loj2863]组合动作的主要内容,如果未能解决你的问题,请参考以下文章