LOJ.2863.[IOI2018]组合动作(交互)

本文介绍了一种通过最少询问次数来确定未知字符串的算法。利用特殊构造的询问串,该算法能在限定条件下高效找出目标字符串。文章详细解释了算法流程,并提供了完整的C++实现代码。

题目链接

通过两次可以先确定首字母。然后还剩下\(n-1\)位,之后每一位只有三种可能。
最简单的方法是每次确定一位,通过两次询问显然可以确定。但是只能一次询问。
首字母只会出现一次,即我们可以将串分割成\(4\)个进行一次询问。我们是可以一次询问确定一位的。
比如:首字母为\(a\),其它字母为\(bcd\)\(ans\)为已确定的前\(i-1\)位,则询问\(ans+bb+ans+bc+ans+bd+ans+c\),就能确定\(i\)了。
这样第\(n\)位需要能单独判断,可以直接用两次。
那么总询问次数为:\(2+n-2+2=n+2\)

#include <string>
#include <algorithm>
#include "combo.h"

std::string guess_sequence(int n)
{
    char a,b,c,d;
    std::string ans="";
    if(press("AB")) c='X', d='Y', press("A")?(b='B',a='A'):(b='A',a='B');
    else c='A', d='B', press("X")?(b='Y',a='X'):(b='X',a='Y');
    ans=a;
    if(n==1) return ans;//!
    for(int i=1,t; i<n-1; ++i)
    {
        if((t=press(ans+b+b+ans+b+c+ans+b+d+ans+c))==i) ans+=d;
        else if(t==i+1) ans+=c;
        else ans+=b;
    }
    if(press(ans+b)==n) ans+=b;
    else if(press(ans+c)==n) ans+=c;
    else ans+=d;
    return ans;
}

转载于:https://www.cnblogs.com/SovietPower/p/9673989.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值