SCP-bzoj-1019
项目编号:bzoj-1019
项目等级:Safe
项目描述:
特殊收容措施:
对于一个hanoi,知道了各种移动操作的优先级,也就确定了方案。可以证明对于盘子数为N的hanoi,任意移动方案都等价于将数目为N-1的一叠盘子移动k次,并将最小的一个盘子经过b次后移动到目标柱顶端。这样,hanoi的任一移动方案所需次数都满足线性递推式f[n]=k*f[n-1]+b。
因此我们暴力算出数列f的前几项(更确切地,前三项即可),然后递推即可。加上矩乘优化后理论复杂度O(log2n)。
附录:
(嗯,实际上N≤30根本不需要矩乘。。也懒得写。。)
#include <bits/stdc++.h>
#define range(i,c,o) for(register int i=(c);i<(o);++i)
#define dange(i,c,o) for(register int i=(c);i>(o);--i)
using namespace std; static int N;
long long f[];
string opt[];
stack<int> stick[]; inline long long solve(const int&x)
{
long long ret=; int las=;
range(i,,) for(;!stick[i].empty();stick[i].pop());
dange(i,x,) stick[].push(i);
for(;stick[].size()<x&&stick[].size()<x;++ret)
{
range(i,,)
{
int fr=opt[i][]-'A',to=opt[i][]-'A';
if(
fr!=las&&!stick[fr].empty()&&(
stick[to].empty()||
stick[fr].top()<stick[to].top()
)
)
{
stick[las=to].push(stick[fr].top());
stick[fr].pop(); break;
}
}
}
return ret;
} int main()
{
ios::sync_with_stdio();
cin>>N; range(i,,) cin>>opt[i];
f[]=,f[]=solve(),f[]=solve();
long long k=(f[]-f[])/(f[]-),b=f[]-k;
range(i,,N+) f[i]=k*f[i-]+b;
return cout<<f[N]<<endl,;
}
SCP-bzoj-1019的更多相关文章
- BZOJ 1019: [SHOI2008]汉诺塔
Description 一个汉诺塔,给出了移动的优先顺序,问从A移到按照规则移到另一个柱子上的最少步数. 规则:小的在大的上面,每次不能移动上一次移动的,选择可行的优先级最高的. Sol DP. 倒着 ...
- 【BZOJ 1019】【SHOI2008】汉诺塔(待定系数法递推)
1019: [SHOI2008]汉诺塔 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 559 Solved: 341[Submit][Status] ...
- BZOJ 1019 汉诺塔
Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. 对汉诺塔的一次合法的操 ...
- BZOJ 1019: [SHOI2008]汉诺塔( dp )
dp(x, y)表示第x根柱子上y个盘子移开后到哪根柱子以及花费步数..然后根据汉诺塔原理去转移... ------------------------------------------------ ...
- 【BZOJ 1019】 1019: [SHOI2008]汉诺塔 (DP?)
1019: [SHOI2008]汉诺塔 Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一 ...
- 【BZOJ 1019】 [SHOI2008]汉诺塔
[题目链接]:http://www.lydsy.com/JudgeOnline/problem.php?id=1019 [题意] [题解] 这个题解讲得很清楚了 http://blog.sina.co ...
- BZOJ 1019 :[SHOI2008]汉诺塔(递推)
好吧蒟蒻还是看题解的 其实看到汉诺塔就该想到是递推了 设f[i][j]表示i个在j杆转移到另一个杆的次数 g[i][j]表示i个在j杆转移到那个杆上 可得 f[i][j]=f[i-1][j]+1+f[ ...
- [BZOJ]1019 汉诺塔(SHOI2008)
找规律成功次数++. Description 汉诺塔由三根柱子(分别用A B C表示)和n个大小互不相同的空心盘子组成.一开始n个盘子都摞在柱子A上,大的在下面,小的在上面,形成了一个塔状的锥形体. ...
- 【BZOJ】【1019】【SHOI2008】汉诺塔
递推/DP 类似普通汉诺塔的一个递推(模拟?$10^{18}$没法模拟吧…… 题解:http://blog.csdn.net/regina8023/article/details/43016813 因 ...
- 【BZOJ】1019: [SHOI2008]汉诺塔
http://www.lydsy.com/JudgeOnline/problem.php?id=1019 题意:汉诺塔规则,只不过盘子n<=30,终点在B柱或C柱,每一次移动要遵守规则:1.小的 ...
随机推荐
- shell脚本学习(4)cut
cut 的两种用法 1种是 -c list 剪切字符串中特定位置的文字, /etc/passwd中的原始数据: yuyuyu:x:1000:1000:yuyuyu,,,:/home/yuyuyu: ...
- mock.js模拟生成假数据
mock使用方法很简单, 下面是简单的用法, 详细的用法可以看官方文档, 写的很清楚, 下面的代码直接拷贝到本地html文件, 双击打开即可生成你想要的数据 <!DOCTYPE html> ...
- CTF | bugku | 字符?正则?
做题链接 一个详细讲正则的网址1 一个详细讲正则的网址2 代码如下 <?php highlight_file('2.php'); $key='KEY{********************** ...
- 7.zabbix常用item
zabbix常用item zabbix常用item vfs.file.md5sum[/etc/crontab] {basic:vfs.file.md5sum[/etc/crontab].diff()} ...
- Xcode cannot run using the selected device after upgrade
Please follow below step 1>Go to Project Build setting 2>Change compiler for c/c++/objective c ...
- 左手Mongodb右手Redis 第三章mongdb操作
mongodb查询操作 1.查询操作 db.getCollection('example_data_1').find({}) 查询所有的信息,相当于mysql中的select * from tabl ...
- 【C#学习笔记】 IDisposable 接口
在.net 编程环境中,系统的资源分为托管资源和非托管资源. 对于托管的资源的回收工作,是不需要人工干预回收的,而且你也无法干预他们的回收,所能够做的只是了解.net CLR如何做这些操作.也就是说对 ...
- 为什么tcp-wrappers被Redhat Centos Fedora废弃?
1 简述 TCP wrappers is a simple tool to block incoming connection on application level. This was very ...
- List<Map>去重并合并数量
今天在查询出的sql中,出现了部门名称和部门ID有重合的数据!当然这样在页面上展示也会容易一起误导!查询出的数据结构如下图 希望根据deptid中 >最后一个节点id把deptname 合并成& ...
- php Connection timed out after 30000 milliseconds
function HttpRequest($url, $params, $method = 'GET', $header = array(), $bEncode = true){ $opts = ar ...