[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 }
View Code

 

转载于:https://www.cnblogs.com/PYWBKTDA/p/11523506.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值