zoukankan      html  css  js  c++  java
  • jzoj 3948 Hanoi 塔

    input  一行两个整数n,k。

    output 一行一个整数,表示达到相同状态时小W 需要的移动次数。

    30%的数据,n<=10。
    100%的数据,1<=n<20,0<=k<2^n。

    SOL:我们发现N不大,对于标准做法我们暴力模拟。对于w的做法我们发现一次solve_w(N)的代价是3^N-1,

    那么我们每次可以用数学方法计算。

    #include<bits/stdc++.h>
    using namespace std;
    int f[29],k,n;
    long long p[29],ans;
    void sol(int nn,int fo,int wl,int sp) {
        if (nn>0) {
            sol(nn-1,fo,sp,wl);
            if (!k) return;
            f[nn]=wl; k--;
            sol(nn-1,sp,wl,fo);
        }
    }
    void Sol(int nn,int fo,int wl,int sp) {
        if (nn>0) {
            if (fo==f[nn]) {
                Sol(nn-1,fo,wl,sp); return;
            }
            if (sp==f[nn]) {
                ans+=p[nn-1]+1;
                Sol(nn-1,wl,fo,sp);
                return;
            }
            ans+=p[nn-1]+1<<1;
            Sol(nn-1,fo,wl,sp);
        }
    }
    signed main () {
        scanf("%d%d",&n,&k);
    //    k=1<<20;
        sol(n,0,1,2);
    //    p[0]=1;
        for (int i=1;i<=n;i++) p[i]=p[i-1]*3+2;
        Sol(n,0,1,2);
    //    for (int i=1;i<=n;i++) {
    //        if (f[i]==now[i]) continue;
    //        if (f[i]==0&&now[i]==1) {
    //            
    //        }
    //    }
        printf("%lld
    ",ans);
    }
  • 相关阅读:
    点双连通分量
    CF 839 E-最大团
    线性基
    CF 859 E
    【bzoj1303】[CQOI2009]中位数图
    【bzoj2282】[Sdoi2011]消防
    【bzoj2654]】tree
    【bzoj2600】 [Ioi2011]ricehub
    【bzoj4027】 [HEOI2015]兔子与樱花
    【bzoj3670】 [Noi2014]动物园
  • 原文地址:https://www.cnblogs.com/rrsb/p/9299140.html
Copyright © 2011-2022 走看看