1 条题解

  • 0
    @ 2025-8-24 21:44:42

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 星爵
    **

    搬运于2025-08-24 21:44:42,当前版本为作者最后更新于2017-10-24 16:28:07,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    好像没什么人做这道题。。。

    首先肯定是想4^n暴枚,可惜会超时。

    考虑到某一轮作出某个选择的条件是:无论以后牛怎么选,农夫都有合法的选择方案。

    如果枚举两个选择的话肯定不行,但是两种选择的结果逻辑运算有神奇的短路性质,所以在某一种满足条件的情况下另一种无需计算,这样会减小计算量。

    那么数据故意卡怎么办呢?神奇的随机选择解决它。

    附上真*题解:http://txhwind.blog.163.com/blog/static/203524179201211109155143/

    #include<cstdio>
    #include<iostream>
    #include<cstdlib>
    const int MAXN=14;
    int m,x[MAXN<<3];
    inline int calc(long long run,int n,bool a,bool b){
            int t=n*8+a*4+b*2;
            return (run*(x[t]+1)+x[t+1])%m;
    }
    int n,k;
    bool check2(int,int);
    bool check1(int now,int run,bool a){
            bool b=rand()&1;
            return check2(now+1,calc(run,now,a,b)) && check2(now+1,calc(run,now,a,!b));
    }
    bool check2(int now,int run){
            if(now==n)
                    return run<=k || run+k>=m;
            bool a=rand()&1;
            return check1(now,run,a) || check1(now,run,!a);
    }
    int main(){
        int i,run=0;
        char c[MAXN];
        scanf("%d%d%d%s",&n,&m,&k,c);
        for(i=0;i<n<<3;++i)
            scanf("%d",x+i);
        for(i=0;i<n;++i)
            if(check1(i,run,1)){
                putchar('B');
                run=calc(run,i,1,c[i]=='B');
            }
            else{
                putchar('T');
                run=calc(run,i,0,c[i]=='B');
            }
        return 0;
    }
    
    
    • 1

    信息

    ID
    2106
    时间
    1000ms
    内存
    125MiB
    难度
    6
    标签
    递交数
    0
    已通过
    0
    上传者