我们可以发现最多只会进行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的更多相关文章

  1. 折半搜索(meet in the middle)

    折半搜索(meet in the middle) ​ 我们经常会遇见一些暴力枚举的题目,但是由于时间复杂度太过庞大不得不放弃. ​ 由于子树分支是指数性增长,所以我们考虑将其折半优化; 前言 ​ 这个 ...

  2. Meet in the middle

    搜索是\(OI\)中一个十分基础也十分重要的部分,近年来搜索题目越来越少,逐渐淡出人们的视野.但一些对搜索的优化,例如\(A\)*,迭代加深依旧会不时出现.本文讨论另一种搜索--折半搜索\((meet ...

  3. Meet in the middle学习笔记

    Meet in the middle(MITM) Tags:搜索 作业部落 评论地址 PPT中会讲的很详细 当搜索的各项互不影响(如共\(n\)个物品前\(n/2\)个物品选不选和后\(n/2\)个物 ...

  4. 【BZOJ4800】[Ceoi2015]Ice Hockey World Championship Meet in the Middle

    [BZOJ4800][Ceoi2015]Ice Hockey World Championship Description 有n个物品,m块钱,给定每个物品的价格,求买物品的方案数. Input 第一 ...

  5. 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 ...

  6. 「10.13」毛一琛(meet in the middle)·毛二琛(DP)·毛三琛(二分+随机化???)

    A. 毛一琛 考虑到直接枚举的话时间复杂度很高,我们运用$meet\ in\ the\ middle$的思想 一般这种思想看似主要用在搜索这类算法中 发现直接枚举时间复杂度过高考虑枚举一半另一半通过其 ...

  7. meet in the middle 复习笔记

    前言 若干年前看过现在又忘了.这么简单都忘 所以今天来重新复习一下. 正题 考虑这样的问题: 给定 \(n\) 个物品的价格,你有 \(m\) 块钱,每件物品限买一次,求买东西的方案数. \(n\le ...

  8. 浅谈Meet in the middle——MITM

    目测观看人数 \(0+0+0=0\) \(\mathrm{Meet\;in\;the\;middle}\)(简称 \(\rm MITM\)),顾名思义就是在中间相遇. 可以理解为就是起点跑搜索树基本一 ...

  9. SPOJ4580 ABCDEF(meet in the middle)

    题意 题目链接 Sol 发现abcdef是互不相关的 那么meet in the middle一下.先算出abc的,再算def的 注意d = 0的时候不合法(害我wa了两发..) #include&l ...

随机推荐

  1. jQuery Webcam Plugin jscam.swf文件反编译工具使用说明

    jQuery webcam plugin是一个在ie,firefox,chrome下都可以用的摄像头摄像及拍照用的插件. (http://www.xarg.org/project/jquery-web ...

  2. (34)Spring Boot的启动器Starter详解【从零开始学Spring Boot】

    Spring Boot应用启动器基本的一共有N(现知道的是44)种:具体如下: 1)spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. 2 ...

  3. dubbo-源码阅读之bean装配过程(四)

    Spring自定义schema 我们再使用dubbo进行时 会经常看到这样的标签 <!--开启注解扫描--> <context:component-scan base-package ...

  4. 敏捷迭代:Sprint燃尽图的7个图形特征及说明的问题

    本文写于很多年前(2006),并在很多地方被引用.而现在,笔者对于Sprint燃尽图的理解有了戏剧性的变化--在看到很多团队滥用它之后.笔者不再建议团队做Sprint燃尽图,因为它们不仅不会增加多少有 ...

  5. code vs 3305 水果姐逛水果街Ⅱ

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 水果姐第二天心情也很不错, ...

  6. 一个表空间使用率查询sql的优化

    话不多说,直接上运行计划: SQL> set lines 500; SQL> set pagesize 9999; SQL> set long 9999; SQL> selec ...

  7. Think In java 笔记一

    本博客不再更新,很多其它精彩内容请訪问我的独立博客 今天起要读这本书了,曾经都没有认真读过书.是时候改变自己了. 如今认为不是写不出代码,而是没有想法,没有架构,要做一个大神不是写多少代码.而是要能做 ...

  8. Android动态部署五:怎样从插件apk中启动Service

    转载请注明出处:http://blog.csdn.net/ximsfei/article/details/51072332 github地址:https://github.com/ximsfei/Dy ...

  9. OLR文件丢失的恢复

    11.2.0.1的RAC中,rac1和rac2 一.OLR有备份的情况 1.手动将rac1中的olr重命名,模拟丢失 mv rac1.olr rac1.olr.test 2.重新启动crs ./crs ...

  10. How do you install Google Chrome on Ubuntu?

    https://askubuntu.com/questions/510056/how-to-install-google-chrome sudo apt-get install chromium-br ...