【2016-2017 ACM-ICPC (ECNA 2016) G】That's one Hanoi-ed Teacher【汉诺塔问题】
题意:
3根柱子的汉诺塔模型。给定每根柱上当前时刻有几个圆盘,判断这个时刻是否会出现在汉诺塔模拟过程中,如果不会,输出"NO"。否则输出当前状态离终态还有多少步。
思路:
我们先回顾一下普通汉诺塔的模拟过程。
void dfs(int n,int a,int b,int c) //第n个圆盘从a->c
{if(n == 1){printf("%d, %d->%d\n",n,a,c);return;}dfs(n-1,a,c,b);printf("%d, %d->%d\n",n,a,c);dfs(n-1,b,a,c);
}
我们可以发现模拟过程中的几步。首先是n-1从a->b,然后n从a->c,然后n-1从b->c。因此我们可以根据第n个圆盘所在的位置,判断当前状态处于哪一个步骤。然后再判断n-1个圆盘所处的位置,不断递归下去。这里需要知道,n个圆盘的汉诺塔,一共需要移动2^n-1步,F[n] = 2*F[n-1]+1,因此我们可以根据每个盘的状态,对当前步数区间进行缩小,最终可以求出结果答案。详情看代码。
代码:
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define LOG1(x1,x2) cout << x1 << ": " << x2 << endl;
#define LOG2(x1,x2,y1,y2) cout << x1 << ": " << x2 << " , " << y1 << ": " << y2 << endl;
typedef long long ll;
typedef double db;
const db EPS = 1e-9;
using namespace std;
const int N = 70;int num[N],n,flag;
ll ans;// void dfs(int n,int a,int b,int c) //a->c
// {
// if(n == 1){
// printf("%d, %d->%d\n",n,a,c);
// return;
// }
// dfs(n-1,a,c,b);
// printf("%d, %d->%d\n",n,a,c);
// dfs(n-1,b,a,c);
// }ll dfs(int n,ll l,ll r,int a,int b,int c)
{if(num[n] == a){r = (r-l-1)/2+l;if(n == 1) return l;if(num[n-1] == b) return dfs(n-1,l,r,a,c,b);else if(num[n-1] == a) return dfs(n-1,l,r,a,c,b);else{flag = -1;return 0;}} else if(num[n] == c){l = (r-l-1)/2+l+1;if(n == 1) return l;if(num[n-1] == b) return dfs(n-1,l,r,b,a,c);else if(num[n-1] == c) return dfs(n-1,l,r,b,a,c);else{flag = -1;return 0;}}else{flag = -1;return 0;}
}int main()
{flag = 0;ll base = 1;rep(i,0,2){int xx; scanf("%d",&xx); n += xx;rep(j,1,xx){int yy; scanf("%d",&yy);num[yy] = i;}}// rep(i,1,n) printf("num[%d]:%d\n",i,num[i]);rep(i,1,n) base *= 2;base--;int jud = 0;ans = dfs(n,0,base,0,1,2);if(jud) printf("No\n");else{if(flag == -1) printf("No\n");else{printf("%lld\n",base-ans);}}return 0;
}/*
5 5 4 3 2 1
0
0
*/
【2016-2017 ACM-ICPC (ECNA 2016) G】That's one Hanoi-ed Teacher【汉诺塔问题】相关推荐
- 2017 ACM ICPC Asia Regional - Daejeon
2017 ACM ICPC Asia Regional - Daejeon Problem A Broadcast Stations 题目描述:给出一棵树,每一个点有一个辐射距离\(p_i\)(待确定 ...
- ACM ICPC China final G Pandaria
目录 ACM ICPC China final G Pandaria ACM ICPC China final G Pandaria 题意:给一张\(n\)个点\(m\)条边的无向图,\(c[i]\) ...
- 2016 年 ACM/ICPC 青岛区域赛 Problem C Pocky
昨晚乱入学弟的训练赛,想了一下这个题.推导的过程中,加深了对公理化的概率论理解.$\newcommand{\d}{\mathop{}\!\mathrm{d}}$ 解法一 考虑 $ d < L$ ...
- 2017 ACM/ICPC 南宁赛区小结 By JSB @ Reconquista
Statistics TYPE: Onsite Contest NAME: 2017 - ICPC - Asia Nanning PLAT: pc^2 TIME: 2017/11/26 09:00-1 ...
- 2017 ACM ICPC Asia Shenyang Regional Contest 题解(10 / 13)【每日亿题2 / 16】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.(2017 ICPC shenyang I)Little Boxes B.(2017 ICP ...
- 2017 ACM/ICPC 北京赛区小结 By jsb @Reconquista
Statistics TYPE: Onsite Contest NAME: 2017 - ICPC - Asia Beijing PLAT: hihoCoder TIME: 2017/11/19 09 ...
- 2017 ACM/ICPC(西安)赛后总结
早上8:00的高铁,所以不得不6点前起床,向火车站赶--到达西安后已经是中午,西工大距离西安北站大概3小时车程的距离,只好先解决午饭再赶路了--下午3.30的热身赛,一行人在3.35左右赶到了赛场,坐 ...
- [Contest]2017 ACM/ICPC Asia Regional Shenyang Online(01 03 07 09 10 11待补)
1001 string string string 题意 给定一个字符串$s$,求其中出现$k$次的子串的个数. 题解 后缀自动机. 代码 1002 cable cable cable 题意 给定$M ...
- 2017 ACM ICPC Asia Regional - Daejeon Programming Constest
A: Broadcast Stations 题目大意 给定一棵树,选一些节点iii,赋予P(i)" role="presentation">P(i)P(i)P(i) ...
- 2017 ACM/ICPC Asia Regional Shenyang Online array
原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6197 题目大意:给出一个序列,删去k个元素是否能构成不上升序列或不下降子序列 (呃,先凑个数吧 二分+ ...
最新文章
- Docker 安装MySQL以及外部访问
- 防止入侵者嗅探web密码
- 用户画像2种数据存储的方式
- 单细胞转录组基本概念(一)
- UVA 10129 Play on Words
- Wordpress 自定义文章类型添加 Categoried、Tags
- 《Python自动化》学习笔记:百度云智能实现提取身份证信息
- 电脑电子版文件怎么弄_清空回收站后,如何找回删除的文件?
- 关于interface
- WLT8016:模组通信调试
- JDK 11 是发布了,但收费吗?
- 如何去做一个完整的网站SEO优化方案!
- \xe8\x83\xa5\xe5\xb8\x85\xe6\x9d\xb0转中文
- End-to-end 3D Point Cloud Instance Segmentation without Detection
- 3.图灵学院-----阿里/京东/滴滴/美团整理----高频JVM调优篇
- 水溶性花青素连接剂1617497-19-4,diSulfo-Cyanine5 alkyne,二磺酸花青素Cy5炔基
- 7-34 任务调度的合理性(25 分)
- 联想M7400Pro打印满张纸黑
- 堡垒机AccessClient插件在mac系统下闪退的解决办法
- 如何正确选择集体渲染(云渲染)和gpu离线渲染