Editing a Book 搜索 + meet in the middle
我们可以发现最多只会进行5次操作。
由此我们从双向跑dfs,用一个unordered_map来保存状态,枚举一下两边的深度即可。
如果4次仍然不可行,则只有可能是5次。所以正反最多只需要搜2层
code:
#include<cstdio>
#include<tr1/unordered_map>
#include<algorithm>
#include<queue>
using namespace std;
using namespace std :: tr1;
unordered_map<long long ,int>F[3];
queue<long long>Q;
int n, A[20], w[20];
int getnext(int arr[],int cur)
{
while(cur < n && arr[cur+1] == arr[cur] + 1)++cur;
return cur;
}
long long get(int arr[])
{
long long tmp = 0;
for(int i = 1;i <= n; ++i)
{
tmp = tmp * 10 + arr[i];
}
return tmp;
}
int dfs(int cur,int target,int arr[],int ty)
{
if(cur == target)
{
long long fin = get(arr);
F[ty][fin] = -1;
Q.push(fin);
if(F[ty^1][fin] == -1) return 1;
return 0;
}
int h[12];
for(int lefts = 1;lefts <= n; ++lefts)
{
for(int rights = lefts; rights <= n; ++rights)
{
int pos = 0;
for(int fronts = 1; fronts < lefts; ++fronts)
{
pos = 0;
for(int i = 1; i < fronts; ++i) h[++pos] = arr[i];
for(int i = lefts; i <= rights ;++i) h[++pos] = arr[i];
for(int i = fronts;i < lefts; ++i) h[++pos] = arr[i];
for(int i = rights + 1; i <= n; ++i)h[++pos] = arr[i];
if(dfs(cur + 1,target,h,ty)) return 1;
}
for(int backs = rights + 1; backs <= n; ++backs)
{
pos = 0;
for(int i = 1;i < lefts; ++i) h[++pos] = arr[i];
for(int i = rights + 1;i <= backs; ++i)h[++pos] = arr[i];
for(int i = lefts; i <= rights ;++i)h[++pos] = arr[i];
for(int i = backs + 1;i <= n; ++i)h[++pos] = arr[i];
if(dfs(cur + 1, target,h,ty))return 1;
}
}
}
return 0;
}
int main()
{
int cas = 0;
while(1)
{
scanf("%d",&n);
if(!n)break;
for(int i = 1;i <= n;++i)
{
scanf("%d",&A[i]);
w[i] = A[i];
}
sort(w + 1, w + 1 + n);
if(getnext(A,1) == n)
{
printf("0\n");
continue;
}
while(!Q.empty())
{
F[0][Q.front()] = 0, F[1][Q.front()] = 0;
Q.pop();
}
F[1][get(w)] = -1;
if(dfs(0,1,A,0))printf("1\n");
else if(dfs(0,1,A,0) || dfs(0,1,w,1))printf("2\n");
else if(dfs(0,2,A,0) || dfs(0,1,w,1))printf("3\n");
else if(dfs(0,2,A,0) || dfs(0,2,w,1))printf("4\n");
else printf("5\n");
}
return 0;
}
Editing a Book 搜索 + meet in the middle的更多相关文章
- 折半搜索(meet in the middle)
折半搜索(meet in the middle) 我们经常会遇见一些暴力枚举的题目,但是由于时间复杂度太过庞大不得不放弃. 由于子树分支是指数性增长,所以我们考虑将其折半优化; 前言 这个 ...
- Meet in the middle
搜索是\(OI\)中一个十分基础也十分重要的部分,近年来搜索题目越来越少,逐渐淡出人们的视野.但一些对搜索的优化,例如\(A\)*,迭代加深依旧会不时出现.本文讨论另一种搜索--折半搜索\((meet ...
- Meet in the middle学习笔记
Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...
- 【BZOJ4800】[Ceoi2015]Ice Hockey World Championship Meet in the Middle
[BZOJ4800][Ceoi2015]Ice Hockey World Championship Description 有n个物品,m块钱,给定每个物品的价格,求买物品的方案数. Input 第一 ...
- Meet in the middle算法总结 (附模板及SPOJ ABCDEF、BZOJ4800、POJ 1186、BZOJ 2679 题解)
目录 Meet in the Middle 总结 1.算法模型 1.1 Meet in the Middle算法的适用范围 1.2Meet in the Middle的基本思想 1.3Meet in ...
- 「10.13」毛一琛(meet in the middle)·毛二琛(DP)·毛三琛(二分+随机化???)
A. 毛一琛 考虑到直接枚举的话时间复杂度很高,我们运用$meet\ in\ the\ middle$的思想 一般这种思想看似主要用在搜索这类算法中 发现直接枚举时间复杂度过高考虑枚举一半另一半通过其 ...
- meet in the middle 复习笔记
前言 若干年前看过现在又忘了.这么简单都忘 所以今天来重新复习一下. 正题 考虑这样的问题: 给定 \(n\) 个物品的价格,你有 \(m\) 块钱,每件物品限买一次,求买东西的方案数. \(n\le ...
- 浅谈Meet in the middle——MITM
目测观看人数 \(0+0+0=0\) \(\mathrm{Meet\;in\;the\;middle}\)(简称 \(\rm MITM\)),顾名思义就是在中间相遇. 可以理解为就是起点跑搜索树基本一 ...
- SPOJ4580 ABCDEF(meet in the middle)
题意 题目链接 Sol 发现abcdef是互不相关的 那么meet in the middle一下.先算出abc的,再算def的 注意d = 0的时候不合法(害我wa了两发..) #include&l ...
随机推荐
- 程序中的文件之沙盒以及plist文件的初步使用
沙盒是相对于"应用程序"的文件,也就是相相应app所在的页面的文件. 每个应用都有自己的应用沙盒(应用沙盒就是文件系统文件夹).与其它文件系统隔离.应用必须呆在在积极的沙盒中.其它 ...
- 我的红外arduino链接,!!!!
点击打开链接http://blog.csdn.net/g1342522389/article/details/46272473 一定要赞,小编非常辛苦.
- java中tcp小样例
服务端: ServerSocket service = new ServerSocket(7777); Socket socket = service.accept(); InputStream in ...
- 设计模式C++实现——组合模式
模式定义: 组合模式同意你将对象组合成树形结构来表现"总体/部分"层次结构.组合能让客户以一致的方式处理个别对象以及对象组合. 这个模式可以创建一个树形结构,在同一个结构中处理嵌套 ...
- linux下安装rar解压包
直接解压时出现的问题如下 原因:使用rar命令需要安装WinRAR 1.在本机下载好解压,然后将解压包拖到linux上 2.进行安装,在rar目录想直接make
- Qt由pcm数据生成wav文件
void AudioGrabber::saveWave(const QString &fileName, const QByteArray &raw, const QAudioForm ...
- Mina airQQ聊天开门见山篇(一)
Mina airQQ聊天开门见山篇(一) 近期项目可能要用到Mina,这个礼拜就在看这个框架,所以想写个小小的聊天的demo来巩固下,打算用几篇博客来记录下相关的知识 client用的是Flex Ai ...
- camera table表编译
mmm -j8 vendor/mediatek/proprietary/hardware/mtkcam/v1/common/paramsmgr/ 2>&1 | tee ft.lib.lo ...
- Android平台Overlay机制【转】
本文转载自:http://blog.csdn.net/wh_19910525/article/details/39254815 Android overlay 机制允许在不修改packages中apk ...
- DNS 隐蔽通道工具资料汇总
http://www.cnblogs.com/bonelee/p/7651746.html DNS隧道和工具 内含dns2tcp.iodine.dnscat2工具的简单使用说明 iodine工具的使用 ...