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

20160721noip模拟赛alexandrali

时间:2016-07-30 22:38:27      阅读:152      评论:0      收藏:0      [点我收藏+]

标签:

【题目大意】

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

技术分享 技术分享

图1

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

技术分享

n<=技术分享

【解题】考虑每一种高度,至少需要多少个方块,我们计算出这些值,随便维护一下就好了呀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任意一个柱子上即视为游戏结束.)

【解题】

     由于第二行的输入只有 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<<"规律不对啊 日";     
    
}

20160721noip模拟赛alexandrali

标签:

原文地址:http://www.cnblogs.com/chouti/p/5721750.html

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