UVA 10795 A Different Task(模拟)
题目链接:https://vjudge.net/problem/UVA-10795
一道比较有思维含量的一道题:
注意一种分治的思想和“除了柱子x和柱子y之外的那个柱子”编号的问题。
首先在初始局面和目标局面中找到所在柱子不同的盘子中编号最大的一个,设为$k$,那么$k$必须要移动。
假设$k$要从柱子一移动到柱子二,在$k$移动之前,由于编号比$k$大的盘子不需要移动,也不会碍事,所以把它们当作不存在。编号比$k$小的只能在柱子三上。
那么这时柱子一上只有$k$,柱子二为空,柱子三上有$1,2,3...k-1$。这个局面成为“参考局面”。
而盘子的运动是可逆的,所以根据对称性,只要求出初始局面和目标局面移动到“参考局面”的步数和再加一即可。
那么写一个函数$f(P,i,final)$,($P[i]$表示盘子$i$的柱子编号,$f$表示把$1,2,3....i-1$全部移到柱子$final$所需步数)。
则$ans=f(start,k-1,6-start[k]-finish[k])+f(finish,k-1,6-start[k]-finish[k])+1$。
其中注意“除了柱子x和柱子y之外的那个柱子”编号为$6-x-y$。(普通汉诺塔结论)
最后进行递归:
$i=0 -> 0$
$P[i]=final -> f(P,i,final)=f(P,i-1,final)$
$f(P,i,final)=f(P,i-1,6-P[i]-final)+2^{i-1}$
AC代码:
#include<cstdio>
#include<iostream> using namespace std;
typedef long long ll; const int maxn=;
int n,start[maxn],finish[maxn]; ll f(int *P,int i,int final){
if(i==) return ;
if(P[i]==final) return f(P,i-,final);
return f(P,i-,-P[i]-final)+(1LL<<(i-));
} int main(){
int kase=;
while(scanf("%d",&n)==&&n){
for(int i=;i<=n;i++) scanf("%d",&start[i]);
for(int i=;i<=n;i++) scanf("%d",&finish[i]);
int k=n;
while(k>=&&start[k]==finish[k]) k--;
ll ans=;
if(k>=){
int other=-start[k]-finish[k];
ans=f(start,k-,final)+f(finish,k-,final)+;
}
printf("Case %d: %lld\n",kase,ans);
}
return ;
}
AC代码
UVA 10795 A Different Task(模拟)的更多相关文章
- UVA 10795 A Different Task(汉诺塔 递归))
A Different Task The (Three peg) Tower of Hanoi problem is a popular one in computer science. Briefl ...
- UVA 10795 - A Different Task(递归)
A Different Task The (Three peg) Tower of Hanoi problem is a popular one in computer science. Brie ...
- UVa 10795 - A Different Task 对称, 中间状态, 数位DP 难度: 3
题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...
- UVa 10795 - A Different Task
题目大意:给出n,表示说有n个大小不同的盘子,然后再给出每个盘子的初始位置和目标位置,要求计算出最少的步数使得每个盘子都移动到它的目标位置. 分析: 首先找最大不在目标柱子上的盘子K,因为如果最大的 ...
- 【汉诺塔问题】UVa 10795 - A Different Task
[经典汉诺塔问题] 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上.有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动 ...
- 二分图最大匹配(匈牙利算法) UVA 670 The dog task
题目传送门 /* 题意:bob按照指定顺序行走,他的狗可以在他到达下一个点之前到一个景点并及时返回,问狗最多能走多少个景点 匈牙利算法:按照狗能否顺利到一个景点分为两个集合,套个模板 */ #incl ...
- UVa新汉诺塔问题(A Different Task,Uva 10795)
主要需要理递归函数计算 #define MAXN 60+10 #include<iostream> using namespace std; int n,k,S[MAXN],F[MAXN] ...
- UVA 10714 Ants 蚂蚁 贪心+模拟 水题
题意:蚂蚁在木棍上爬,速度1cm/s,给出木棍长度和每只蚂蚁的位置,问蚂蚁全部下木棍的最长时间和最短时间. 模拟一下,发现其实灰常水的贪心... 不能直接求最大和最小的= =.只要求出每只蚂蚁都走长路 ...
- UVA 213 Message Decoding 【模拟】
题目链接: https://cn.vjudge.net/problem/UVA-213 https://uva.onlinejudge.org/index.php?option=com_onlinej ...
随机推荐
- mysql远程链接(可以在服务器上配置然后在本地连接远程服务器)
ps:如果一下的连接不成功原因:一定要关闭windows防火墙或者linux的防火墙 1.在服务器端授权(黄色标记的地方第一个是用户名,第二个的意思是可以远程连接,第三个是密码) GRANT ALL ...
- JUC—Callable接口
一.callable接口是什么? 面试题: 获得多线程的方法几种? 正确答案如下: 传统的 是继承thread类和实现runnable接口, java5以后又有实现 callable接口 和 java ...
- php header的使用
// okheader('HTTP/1.1 200 OK'); //设置一个404头:header('HTTP/1.1 404 Not Found'); //设置地址被永久的重定向header('HT ...
- 部署prerender服务器
// 安装 git sudo apt-get install git sudo apt-get install curl // 请先确认服务器是否安装了curl 如果已经安装跳过即可 // 安装 no ...
- 比较一下数据结构的链表和linux i2c驱动难度比较
- 己亥清爽恢复系列之数据文件4篇:DROP表后如何恢复(非闪回技术)
己亥清爽系列说明:清爽系列是作为恢复系列的基础篇,基于FS(File System)文件系统的手工还原恢复,也叫基于用户管理的还原恢复,来自于博客园AskScuti. 实验说明:你不小心Drop掉了一 ...
- C#对config.ini文件进行读取和修改
C#对config.ini文件进行读取和修改: public partial class Patrolcar : Form之后可以加入如下类: #region public class IniFile ...
- vue插槽的使用
一.插槽的基本使用 二.具名插槽的使用 三.编译作用域的例子 四.作用域插槽 一.插槽的基本使用 1.插槽的基本使用<slot></slot> 2.插槽的默认值 ...
- jdk之java.lang.Integer源码理解
基本数据类型的包装类java.lang.Integer是我们频繁使用的一个系统类,那么通过一个示例反应出的几个问题来深入理解一下此类的源码. 需求:实现Integer类型的两个数值交换. packag ...
- 如何查看mac多少位的操作系统?
1.点击工具栏左上角点击 (苹果Logo)标志,关于本机 --> 更多信息 --> 系统报告 -->(左侧栏中)软件 (有的电脑是没有的例如第一张图) 2. 输入命令 una ...