BJ 集训测试1 Problem B 汉诺塔

网友投稿 550 2022-10-22

BJ 集训测试1 Problem B 汉诺塔

BJ 集训测试1 Problem B 汉诺塔

​​ 范围1e5 给定三根柱子的初始状态 给定末状态求从当前状态到终止状态至少要操作多少次

样例

3

2 1 2

0

1 3

1 3

0

2 1 2

网上做法大多是错的..

但是思想是差不多的都是利用这个对称性

考虑假如目标状态完全在一个柱子上那么显然需要从大到小把盘子移动到对应位置同时必须考虑剩下的盘子必须是整理好的所以先利用经典结论将一根柱子上的盘子完全挪动到另一根柱子需要2^n-1次操作

对于样例的解释来看为什么直接做是错的 因为我们不需要将所有盘子先挪动到另一个上 而是可以考虑将终止状态先挪动到另一根柱子上 然后再将初始状态完全挪动到终止状态上 然而中间的挪动过程是不需要比较这两种方式谁优的..

因为经过另外一个柱子需要最少2^(k+1)次 然而直接交换的次数是2^k+2^k-1的可以看作是先将最大挪动到第三个 然后将它上面的挪回去 然后再将我挪过去再重新挪回来

关于最后为什么要比较 博主当时也是听大佬们讲之后意会的 现在已不记得..欢迎私信告诉辣鸡蒟蒻elijahqi qwq

#include#include#define mod 998244353#define N 1100000#define ll long longusing namespace std;inline char gc(){ static char now[1<<16],*S,*T; if (T==S){T=(S=now)+fread(now,1,1<<16,stdin);if (T==S) return EOF;} return *S++;}inline int read(){ int x=0,f=1;char ch=gc(); while(ch<'0'||ch>'9') {if (ch=='-') f=-1;ch=gc();} while(ch<='9'&&ch>='0') x=x*10+ch-'0',ch=gc(); return x*f;}int st[N],ed[N],ans1[N],ans2[N];inline void solve1(int *a,int k,int p){ if (!k) return ; if (a[k]==p) {solve1(a,k-1,p);return;} solve1(a,k-1,6-a[k]-p);++ans1[k-1];} inline void solve2(int *a,int k,int p){ if (!k) return; if (a[k]==p) {solve2(a,k-1,p);return;} solve2(a,k-1,6-a[k]-p);++ans2[k-1];}ll ans;int main(){ freopen("hanoi.in","r",stdin); int n=read(); for (int i=read();i;--i) st[read()]=1; for (int i=read();i;--i) st[read()]=2; for (int i=read();i;--i) st[read()]=3; for (int i=read();i;--i) ed[read()]=1; for (int i=read();i;--i) ed[read()]=2; for (int i=read();i;--i) ed[read()]=3; while(st[n]==ed[n]) --n; solve1(st,n-1,6-st[n]-ed[n]);solve1(ed,n-1,6-st[n]-ed[n]);++ans1[0]; solve2(st,n-1,ed[n]);solve2(ed,n-1,st[n]);++ans2[n-1];++ans2[0]; //所有都具有对称性 所以分成两部分考虑 for (int i=0;i<=n+4;++i) ans1[i+1]+=ans1[i]>>1,ans1[i]%=2; for (int i=0;i<=n+4;++i) ans2[i+1]+=ans2[i]>>1,ans2[i]%=2;// for (int i=0;i<=n+4;++i) printf("%d,ans1[i]);puts("");// for (int i=0;i<=n+4;++i) printf("%d,ans2[i]);puts(""); ll base=1;bool flag=0; for (int i=n+4;~i;--i) if (ans1[i]>ans2[i]) {flag=1;break;}else if (ans1[i]

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:TensorFlow与其他开源框架的集成
下一篇:Leevel- 高性能 PHP 扩展开发框架
相关文章

 发表评论

暂时没有评论,来抢沙发吧~