【题目大意】
有许多木块, 叠放时, 必须正着叠放, 如图1, 左边两块为合法叠放, 右边为不合法叠放.
图1
一个方块被称为稳定的, 当且仅当其放在最底层, 或其正下方有方块且下方的这个方块的四周都有方块. 叠放必须保证所有方块都稳定. 如图2, 左边3个叠放为合法叠放, 右边2个叠放为不合法叠放.
给定一个n,求能叠出的最高稳定建筑的高度
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任意一个柱子上即视为游戏结束.)
第一行输入一个整数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<<"规律不对啊 日"; }