zoukankan      html  css  js  c++  java
  • 20160722noip模拟赛alexandrali

    【题目大意】

    有许多木块, 叠放时, 必须正着叠放, 如图1, 左边两块为合法叠放, 右边为不合法叠放.

    clip_image001clip_image002

    图1

    一个方块被称为稳定的, 当且仅当其放在最底层, 或其正下方有方块且下方的这个方块的四周都有方块. 叠放必须保证所有方块都稳定. 如图2, 左边3个叠放为合法叠放, 右边2个叠放为不合法叠放.

    clip_image004[2]

    给定一个n,求能叠出的最高稳定建筑的高度

    n<=10^9

    【解题】考虑每一种高度,至少需要多少个方块,我们计算出这些值,随便维护一下就好了呀qwq

    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define FO(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout) 
    long long f,sum;
    int n; 
    int main(){
        FO(block);
        scanf("%d",&n);
        f=sum=1;
        if(sum>=n){
            puts("1");return 0;
        } 
        for(int i=2;;i++){
            f=f+(i-1)*4;
            sum=sum+f;
            if(sum>=n){
                cout<<i-(sum!=n); 
                return 0;
            } 
         }     
    }

    T2 hanoi

    【题目大意】

        汉诺塔游戏众所皆知, 现在制定一个如下新的汉诺塔游戏规则:

        共ABC三柱, 起初所有的盘子按从上到下从小到大的顺序排列在A柱, 移动规则依然是只能移动最顶端的盘子, 且一个盘子只能放在更大的盘子上方. 现增加一个规则, 同一个盘子不能被连续移动两次. 现有序列{AB, AC, BA, BC, CA, CB}(AB即表示将A的最上方的盘子移到B)的任一排序, 每次移动必须是在该序列中找到最早的一个合法的操作, 并移动. .(全部移动到BC任意一个柱子上即视为游戏结束.)

    第一行输入一个整数n(n<=20),第二行输入一个操作序列,形同AB, AC, BA, BC, CA, CB

    求游戏结束时所用操作数

    【解题】

         由于第二行的输入只有 6!种 ,可以大胆猜测所有n对于这6!种操作序列的答案是有规律的,发现n=3的时候答案只有三种,那么我们对于操作序列暴力跑一下n=3的情况,判断这个操作序列的答案属于哪一种,直接计算即可

    #include<queue> 
    #include<cstdio>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    #define FO(x) freopen(#x".in","r",stdin),freopen(#x".out","w",stdout)
    char mov[7][2];
    typedef long long ll;
    ll cnt;bool ok;int n;
    int top[3],qu[3][23333];
    void dfs(int lst,int dep){
        if(dep>=cnt)return;
        if(!top[0]&&(!top[1]||!top[2])){
            ok=1;
            return;
        }
        for(int i=0;i<6;i++){
            int a=mov[i][0]-'A',b=mov[i][1]-'A';
            if(!top[a]||a==lst) 
                continue;
            int t=qu[a][top[a]];
            if(top[b]&&t>qu[b][top[b]]) continue;
            --top[a];
            qu[b][++top[b]]=t;
            dfs(b,dep+1); 
            --top[b];
            if(ok) return;
            qu[a][++top[a]]=t;
            break;
        }
    }
    int luangao(){
        ok=0; 
        top[0]=top[1]=top[2]=cnt=0;
        for(int i=3;i>=1;i--) qu[0][++top[0]]=i;
        do{
            dfs(-1,0);
            ++cnt;
            if(cnt>1000) break;
        }while(!ok);
        int P=cnt-2;
        return P;
    }
    void c233(){
        ll x=2;
        for(int i=2;i<=n;i++) x=x*3;
        cout<<x-1;
    }
    void pow2(){
        ll x=1;
        for(int i=1;i<=n;i++) x=x*2;
        cout<<x-1;
    }
    void pow3(){
        ll x=1;
        for(int i=2;i<=n;i++) x=x*3;
        cout<<x;
    }
    int main(){
        FO(hanoi);
        //6*???*2^??? 
        scanf("%d",&n);
        for(int i=0;i<6;i++)scanf("%s",mov[i]);
        int ans3=luangao();
        if(ans3==17)c233();
        else if(ans3==7)pow2();
        else if(ans3==9)pow3();
        else cout<<"规律不对啊 日";     
        
    }
  • 相关阅读:
    HDU 2639 Bone Collector II (01背包,第k解)
    POJ 2184 Cow Exhibition 奶牛展(01背包,变形)
    hihoCoder #1165 : 益智游戏 (挑战赛11 B题)
    UVA 562 Dividing coins 分硬币(01背包,简单变形)
    POJ Charm Bracelet 挑饰品 (常规01背包)
    hiho一下 第四十四周 博弈游戏·Nim游戏(直接公式解)
    UVA 624 CD(01背包,要记录路径)
    118 Pascal's Triangle 帕斯卡三角形 杨辉三角形
    117 Populating Next Right Pointers in Each Node II 每个节点的右向指针 II
    116 Populating Next Right Pointers in Each Node 每个节点的右向指针
  • 原文地址:https://www.cnblogs.com/chouti/p/5721750.html
Copyright © 2011-2022 走看看