码迷,mamicode.com
首页 > 其他好文 > 详细

[loj2863]组合动作

时间:2019-09-15 19:07:37      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:namespace   col   char   alt   lse   int   ESS   space   har   

先用两次猜出第一个字符,后面就不会出现这个字符了 (我们假设这个字符是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 }
View Code

 

[loj2863]组合动作

标签:namespace   col   char   alt   lse   int   ESS   space   har   

原文地址:https://www.cnblogs.com/PYWBKTDA/p/11523506.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!