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

【IOI2018】组合动作

时间:2020-01-13 16:39:17      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:seq   cpp   lse   enc   开始   str   class   增量   mat   

题目

我是垃圾;

最开始觉得可以三次问出第一位,之后还有\(n-1\)位和\(n-1\)次询问,只需要一次确定一位就好了;之后就发现我是垃圾,上来直接press("AB"),如果不是\(0\)那么首位就是\(A\)\(B\),否则就是\(X\)\(Y\),之后再问一次就好了;

之后我们需要用\(n\)次确定\(n-1\)位,于是就开始大跃进了;想着这个应该是除了最后一位需要特殊搞搞,其他只需要一次询问就好了吧;但为什么最后一位需要特殊搞呢,他肯定是让我一次确定两位!

设目前已经确定的前缀是\(S\),不妨假设首位就是\(X\),如果我们询问的串是\(S+A+A,S+A+B,S+A+Y,S+B+A\)四个串拼起来,那么观察一波发现如果返回的增量是\(0\),说明\(A,B\)都不行,这一位是\(Y\);如果返回的增量是\(1\),那么不可能是\(Y\),也不可能是\(A\),毕竟\(A\)后面的三种情况我们都问了,于是这一位是\(B\);如果增量是\(2\)呢,下两位可能是\(AA,AB,AY,BA\)

之后就自闭了,于是就想再问一次把两位都确定下来,就想着我们可以再问一下\(S+A+Y,S+A+A\),如果增量是\(0\),那么就是\(BA\)了;如果增量是\(1\),那么就是\(AB\)了;增量是\(2\)的话,好像无论如何都需要再来一次确定下一位是\(Y\)还是\(A\),于是彻底自闭了;

果不其然我是垃圾,我们直接问\(S+A+A,S+A+B,S+A+Y,S+B\)就好了,如果增量是\(0\),那么就是\(Y\);增量是\(1\),那么就是\(B\);如果增量是\(2\),那么就是\(A\);这样每次确定一位,最后一位需要两次特殊处理一下就好了。

综上所述,我是垃圾

代码

#include "combo.h"
#include<bits/stdc++.h>
#define re register
std::string nw;int tot;
std::string s[5];
std::string guess_sequence(int n) {
    nw="";int k=press("AB");
    if(!k) {
        if(press("X")==1) nw+="X";else nw+="Y";
    }
    if(k==1) {
        if(press("A")==1) nw+="A";else nw+="B";
    }
    if(k==2) nw+="A";
    if(n==1)return nw;
    if(nw!="A")s[++tot]="A";
    if(nw!="B")s[++tot]="B";
    if(nw!="X")s[++tot]="X";
    if(nw!="Y")s[++tot]="Y";
    for(re int i=2;i<n;++i) {
        int len=press(nw+s[1]+s[1]+nw+s[1]+s[2]+nw+s[1]+s[3]+nw+s[2]);
        if(len==i+1) nw+=s[1];
        if(len==i) nw+=s[2];
        if(len==i-1) nw+=s[3];
    }
    if(press(nw+s[1])==n) nw+=s[1];
    else {
        if(press(nw+s[2])==n) nw+=s[2];
        else nw+=s[3];
    }
    return nw;
}
//g++ grader.cpp combo.cpp -o combo -O2 -lm -std=c++11

【IOI2018】组合动作

标签:seq   cpp   lse   enc   开始   str   class   增量   mat   

原文地址:https://www.cnblogs.com/asuldb/p/12187630.html

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