地址 https://algospot.com/judge/problem/read/SORTGAME

解答

常规BFS是会超时的  按照书上的提示 应该是打表(居然还有提倡打表的题目)

tle 代码

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <queue>
  5. #include <map>
  6.  
  7. using namespace std;
  8.  
  9. int n, m;
  10.  
  11. int bfs(const vector<int>& v)
  12. {
  13. vector<int> sorted = v;
  14. sort(sorted.begin(), sorted.end());
  15. queue<vector<int>> q;
  16. map<vector<int>, int> distance;
  17. distance[v] = ;
  18. q.push(v);
  19. while (!q.empty()) {
  20. vector<int> here = q.front();
  21. q.pop();
  22.  
  23. if (here == sorted) return distance[here];
  24. int cost = distance[here];
  25. //翻转可能的子区间
  26. for (int i = ; i < v.size(); i++) {
  27. for (int j = i + ; j <= v.size(); ++j) {
  28. reverse(here.begin() + i, here.begin() + j);
  29. if (distance.count(here) == ) {
  30. distance[here] = cost + ;
  31. q.push(here);
  32. }
  33. reverse(here.begin() + i, here.begin() + j);
  34. }
  35. }
  36. }
  37.  
  38. return -;
  39. }
  40.  
  41. int main()
  42. {
  43. cin >> n;
  44.  
  45. while (n--) {
  46. cin >> m;
  47. vector<int> v;
  48. for (int i = ; i < m; i++) {
  49. int t;
  50. cin >> t;
  51. v.push_back(t);
  52. }
  53.  
  54. cout << bfs(v) << endl;
  55. }
  56.  
  57. return ;
  58. }

ac代码

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <map>
  4. #include <queue>
  5. #include <vector>
  6.  
  7. using namespace std;
  8.  
  9. map<vector<int>, int> toSort;
  10.  
  11. void precalc(int n) {
  12. vector<int> perm(n);
  13. for (int i = ; i < n; ++i) perm[i] = i;
  14. queue<vector<int>> q;
  15. q.push(perm);
  16. toSort[perm] = ;
  17. while (!q.empty()) {
  18. vector<int> here = q.front();
  19. q.pop();
  20. int cost = toSort[here];
  21. for (int i = ; i < n; i++) {
  22. for (int j = i + ; j <= n; ++j) {
  23. reverse(here.begin() + i, here.begin() + j);
  24. if (toSort.count(here) == ) {
  25. toSort[here] = cost + ;
  26. q.push(here);
  27. }
  28. reverse(here.begin() + i, here.begin() + j);
  29. }
  30. }
  31. }
  32. }
  33.  
  34. int solve(const vector<int>& perm)
  35. {
  36. int n = perm.size();
  37. vector<int> fixed(n);
  38. for (int i = ; i < n; ++i) {
  39. int smaller = ;
  40. for (int j = ; j < n; ++j)
  41. if (perm[j] < perm[i])
  42. ++smaller;
  43. fixed[i] = smaller;
  44. }
  45. return toSort[fixed];
  46. }
  47.  
  48. int n, m;
  49. int main()
  50. {
  51. cin >> n;
  52. while (n--) {
  53. cin >> m;
  54. precalc(m);
  55. vector<int> perm;
  56. for (int i = ; i < m; i++) {
  57. int t;
  58. cin >> t;
  59. perm.push_back(t);
  60. }
  61. cout << solve(perm) << endl;
  62. }
  63.  
  64. return ;
  65. }

算法问题实战策略 SORTGAME的更多相关文章

  1. 算法问题实战策略 PICNIC

    下面是另一道搜索题目的解答过程题目是<算法问题实战策略>中的一题oj地址是韩国网站 连接比较慢 https://algospot.com/judge/problem/read/PICNIC ...

  2. 《算法问题实战策略》-chaper7-穷举法

    关于这一章节<算法实战策略>有一段概述问题,我认为对于编程人员来说非常有价值,故在这里进行如下的摘抄: 构想算法是很艰难的工作.相比大家都经历过,面对复杂的要求只是傻乎乎地盯着显示器,或者 ...

  3. 《算法问题实战策略》-chaper32-网络流

    基本的网络流模型: 在图论这一块初步的应用领域中,两个最常见的关注点,其一时图中的路径长度,也就是我们常说的的最短路径问题,另一个则是所谓的“流问题”. 流问题的基本概念: 首先给出一张图. 其实所谓 ...

  4. 《算法问题实战策略》-chaper13-数值分析

    这一章节主要介绍我们在进行数值分析常用的二分.三分和一个近似求解区间积分的辛普森法. 首先介绍二分. 其实二分的思想很好理解并且笔者在之前的一些文章中也有所渗透,对于二次函数甚至单元高次函数的零点求解 ...

  5. 《算法问题实战策略》——chaper9——动态规划法技巧

    Q1: 数字游戏: 两个人(A.B)用n个整数排成的一排棋盘玩游戏,游戏从A开始,每个人有如下操作: (1)    拿走棋盘最右侧或者最左侧的棋子,被拿走的数字从棋盘中抹掉. (2)    棋盘中还剩 ...

  6. 《算法问题实战策略》-chaper8-动态规划法

    Q1:偶尔在电视上看到一些被称为“神童”的孩子们背诵小数点以后几万位的圆周率.背诵这么长的数字,可利用分割数字的方法.我们用这种方法将数字按照位数不等的大小分割后再背诵. 分割形式如下: 所有数字都相 ...

  7. 《算法问题实战策略》-chaper21-树的实现和遍历

    这一章节开始介绍一个数据结构中的一个基本概念——树. 我们从数据结构的解读来解释树结构的重要性,现实世界的数据除了最基本的线性结构(我们常用队列.数组和链表等结构表征),还有一个重要的特性——层级结构 ...

  8. 算法问题实战策略 QUADTREE

    地址 https://algospot.com/judge/problem/read/QUADTREE 将压缩字符串还原后翻转再次压缩的朴素做法 在数据量庞大的情况下是不可取的 所以需要在压缩的情况下 ...

  9. 算法问题实战策略 DICTIONARY

    地址 https://algospot.com/judge/problem/read/DICTIONARY 解法 构造一个26字母的有向图 判断无回路后 就可以输出判断出来的字符序了 比较各个字母的先 ...

随机推荐

  1. Centos7通过yum跟源码编译安装Nginx

    源码编译安装 http://nginx.org/en/download.html 到官网下载,然后用XFTP上传到root目录 把文件解压出来 tar -zxvf nginx-1.16.0.tar.g ...

  2. Java每日一面(Part2数据库)[19/11/28]

    作者:故事我忘了¢个人微信公众号:程序猿的月光宝盒 1.如何设计一个关系型数据库 如上图,首先划分成两大部分: ​ 1.存储部分:类似一个文件系统,把数据存储到一个持久化设备中,如机械硬盘,固态等 ​ ...

  3. js 注意事项使用误区

    1.加法注意事项 2.浮点数注意事项 3.js,数组需使用数字作为下标索引,不支持关联数组的用法.对象不能混淆使用数组的length方法,并且不能使用数字作为下标,得使用属性值作为下标使用,否则会返回 ...

  4. Git实战指南----跟着haibiscuit学Git(第三篇)

    笔名:  haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...

  5. SAP GUI Security notice

    出现错误提示: Failed to load administrator rule file.Check your Installation. 原因: 电脑缺少MS XML4.0,导致SAP客户端无法 ...

  6. 利用 OpenCC 工具进行文字的简繁转换

    前言 近日在公司遇到一个需求,因为准备要推出海外版产品,所以需要将所有的简体文字转换为繁体文字.一开始是改了表面的文字,但是后面发现很多提示语也需要去改,所以找了一个工具去对所有 .m 文件进行批量文 ...

  7. C#中巧用妙法避免嵌套方式使用两个foreach循环

    问题:需要对DataGridViewRow的下拉框列Item2所选内容进行判断,看是否跟数据库里面某个配置表的数据列Item1匹配.如果用两个foreach循环进行匹配,会导致逻辑复杂而且容易只bre ...

  8. 前端小白webpack学习(一)

    俗话说得好,好记性不如烂笔头. 之前就在学习中看过webpack的教程,然而一段时间没用,火速的忘光了.写这篇博文,做个总结,也让自己以后有个地方回顾. 看webpack之前,我先去看了一下官方文档, ...

  9. 如何编写高质量的 JS 函数(4) --函数式编程[实战篇]

    本文首发于 vivo互联网技术 微信公众号 链接:https://mp.weixin.qq.com/s/ZoXYbjuezOWgNyJKmSQmTw作者:杨昆 [编写高质量函数系列],往期精彩内容: ...

  10. PHP 开发工程师基础篇 - PHP 数组

    数组 (Array) 数组是 PHP 中最重要的数据类型,可以说是掌握数组,基本上 PHP 一大半问题都可以解决. PHP 数组与其他编程语言数组概念不一样.其他编程语言数组是由相同类型的元素(ele ...