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 ...
随机推荐
- jQuery Webcam Plugin jscam.swf文件反编译工具使用说明
jQuery webcam plugin是一个在ie,firefox,chrome下都可以用的摄像头摄像及拍照用的插件. (http://www.xarg.org/project/jquery-web ...
- (34)Spring Boot的启动器Starter详解【从零开始学Spring Boot】
Spring Boot应用启动器基本的一共有N(现知道的是44)种:具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2 ...
- dubbo-源码阅读之bean装配过程(四)
Spring自定义schema 我们再使用dubbo进行时 会经常看到这样的标签 <!--开启注解扫描--> <context:component-scan base-package ...
- 敏捷迭代:Sprint燃尽图的7个图形特征及说明的问题
本文写于很多年前(2006),并在很多地方被引用.而现在,笔者对于Sprint燃尽图的理解有了戏剧性的变化--在看到很多团队滥用它之后.笔者不再建议团队做Sprint燃尽图,因为它们不仅不会增加多少有 ...
- code vs 3305 水果姐逛水果街Ⅱ
3305 水果姐逛水果街Ⅱ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 水果姐第二天心情也很不错, ...
- 一个表空间使用率查询sql的优化
话不多说,直接上运行计划: SQL> set lines 500; SQL> set pagesize 9999; SQL> set long 9999; SQL> selec ...
- Think In java 笔记一
本博客不再更新,很多其它精彩内容请訪问我的独立博客 今天起要读这本书了,曾经都没有认真读过书.是时候改变自己了. 如今认为不是写不出代码,而是没有想法,没有架构,要做一个大神不是写多少代码.而是要能做 ...
- Android动态部署五:怎样从插件apk中启动Service
转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/Dy ...
- OLR文件丢失的恢复
11.2.0.1的RAC中,rac1和rac2 一.OLR有备份的情况 1.手动将rac1中的olr重命名,模拟丢失 mv rac1.olr rac1.olr.test 2.重新启动crs ./crs ...
- How do you install Google Chrome on Ubuntu?
https://askubuntu.com/questions/510056/how-to-install-google-chrome sudo apt-get install chromium-br ...