题目链接:序列

Description

给定一个\(1\)~\(n\)的排列x,每次你可以将 \(x_1, x_2, ..., x_i\) 翻转。

你需要求出将序列变为升序的最小操作次数。

多组数据。

数据范围 \(T=5,1\le n\le 25\)

时间限制 \(10\ s\)

Solution

数据范围这么小,我们考虑用\(IDA*\)优化爆搜。

定义估价函数 \(h()=\sum_{i=2}^{n} [abs(x_i-x_{i-1})≠ 1]\)

考虑每一次翻转,最多可以使得\(abs≠1\)的对数减一,所以可以拿\(h()\)来进行估价。

直接爆搜即可。

复杂度 \(O(能过)\)

Code

  1. // Author: wlzhouzhuan
  2. #pragma GCC optimize(2)
  3. #pragma GCC optimize(3)
  4. #include <bits/stdc++.h>
  5. using namespace std;
  6. #define ll long long
  7. #define ull unsigned long long
  8. #define rint register int
  9. #define rep(i, l, r) for (rint i = l; i <= r; i++)
  10. #define per(i, l, r) for (rint i = l; i >= r; i--)
  11. #define mset(s, _) memset(s, _, sizeof(s))
  12. #define pb push_back
  13. #define pii pair <int, int>
  14. #define mp(a, b) make_pair(a, b)
  15. inline int read() {
  16. int x = 0, neg = 1; char op = getchar();
  17. while (!isdigit(op)) { if (op == '-') neg = -1; op = getchar(); }
  18. while (isdigit(op)) { x = 10 * x + op - '0'; op = getchar(); }
  19. return neg * x;
  20. }
  21. inline void print(int x) {
  22. if (x < 0) { putchar('-'); x = -x; }
  23. if (x >= 10) print(x / 10);
  24. putchar(x % 10 + '0');
  25. }
  26. int a[26], flag, n, maxd;
  27. int h() {
  28. int cnt = 0;
  29. for (rint i = 2; i <= n; i++) if (abs(a[i] - a[i - 1]) != 1) {
  30. cnt++;
  31. }
  32. return cnt;
  33. }
  34. bool check() {
  35. for (rint i = 2; i <= n; i++) {
  36. if (a[i - 1] > a[i]) {
  37. return 0;
  38. }
  39. }
  40. return 1;
  41. }
  42. void dfs(int x, int last) { // x表示操作次数,last表示上一次翻转的位置
  43. if (flag) return ;
  44. if (x == maxd) {
  45. if (check()) flag = 1;
  46. return ;
  47. }
  48. if (x + h() > maxd) {
  49. return ;
  50. }
  51. for (rint i = 2; i <= n; i++) if (i != last) {
  52. reverse(a + 1, a + i + 1);
  53. dfs(x + 1, i);
  54. reverse(a + 1, a + i + 1);
  55. }
  56. }
  57. int main() {
  58. int T = read();
  59. while (T--) {
  60. n = read();
  61. for (int i = 1; i <= n; i++) {
  62. a[i] = read();
  63. }
  64. flag = 0;
  65. for (maxd = 0; maxd <= 30; maxd++) {
  66. dfs(0, 0);
  67. if (flag) break;
  68. }
  69. printf("%d\n", maxd);
  70. }
  71. return 0;
  72. }

[BZOJ5449] 序列的更多相关文章

  1. 【夯实PHP基础】UML序列图总结

    原文地址 序列图主要用于展示对象之间交互的顺序. 序列图将交互关系表示为一个二维图.纵向是时间轴,时间沿竖线向下延伸.横向轴代表了在协作中各独立对象的类元角色.类元角色用生命线表示.当对象存在时,角色 ...

  2. Windows10-UWP中设备序列显示不同XAML的三种方式[3]

    阅读目录: 概述 DeviceFamily-Type文件夹 DeviceFamily-Type扩展 InitializeComponent重载 结论 概述 Windows10-UWP(Universa ...

  3. 软件工程里的UML序列图的概念和总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习! 软件工程的一般开发过程:愿景分析.业务建模,需求分析,健壮性设计,关键设计,最终设计,实现…… 时序图也叫序列图(交互图),属于软件 ...

  4. python序列,字典备忘

    初识python备忘: 序列:列表,字符串,元组len(d),d[id],del d[id],data in d函数:cmp(x,y),len(seq),list(seq)根据字符串创建列表,max( ...

  5. BZOJ 1251: 序列终结者 [splay]

    1251: 序列终结者 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3778  Solved: 1583[Submit][Status][Discu ...

  6. 最长不下降序列nlogn算法

    显然n方算法在比赛中是没有什么用的(不会这么容易就过的),所以nlogn的算法尤为重要. 分析: 开2个数组,一个a记原数,f[k]表示长度为f的不下降子序列末尾元素的最小值,tot表示当前已知的最长 ...

  7. [LeetCode] Sequence Reconstruction 序列重建

    Check whether the original sequence org can be uniquely reconstructed from the sequences in seqs. Th ...

  8. [LeetCode] Binary Tree Longest Consecutive Sequence 二叉树最长连续序列

    Given a binary tree, find the length of the longest consecutive sequence path. The path refers to an ...

  9. [LeetCode] Repeated DNA Sequences 求重复的DNA序列

    All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...

随机推荐

  1. 如何在jsp界面进行判断再输出不同的值

    C标签的out <td> <c:if test="${nowtime eq returntime}"> <c:out value="逾期&q ...

  2. Python入门-初识变量类型

    上一篇我们学习了第一行代码,我们print()了很多代码,我们可以print哪些东西呢,这一篇来讲. print()括号里面可以放哪些东西呢?..可以放很多东西,只要是Python的全部数据类型都可以 ...

  3. 整合SSM框架环境搭建

    知识要求 MySQL相关操作 Maven操作 Mybatis.Spring.SpringMVC三个框架基本操作 JavaWeb等知识 搭建环境 MySQL 8.0 Mybatis 3.5.2 使用c3 ...

  4. Python学习阵痛期

    Python和之前学习的Java语法上有较大的区别,例如Java中for循环常使用++自增符,在Python中是没有++的. 因为Python中整型.字符型等都是不可变的,一改变值就重新分配了新的内存 ...

  5. springcloud集群测试

    使用ribbon实现负载均衡,访问同一个url,轮询不同的服务提供端,从不同的数据库中取数据.

  6. 得到一个a(10)到b(20)的随机数。包括10和20

  7. Hoo Smart Chain 万物生长计划火热报名中,可视化公链迸发勃勃生机

    在DeFi越来越趋向同质化和静态化时,Hoo Smart Chain决定充当破局者,宣布决定All In元宇宙,并于2022年3月份开启面向全球去中心化开发者的奖励计划--「万物生长计划」 目前Ter ...

  8. MATLAB地图工具箱学习心得(一)关于地图分带投影的拼接

    关于matlab地图投影系列: MATLAB地图工具箱学习心得(二)设计可变参数和位置拾取的"放大镜"式投影程序 --- 本学期的地图投影课程已经结束了,这篇博客用于记录自己在学习 ...

  9. 运行npm install命令的时候会发生什么?

    摘要:我们日常在下载第三方依赖的时候,都会用到一个命令npm install,那么你知道,在运行这个命令的时候都会发生什么吗? 本文分享自华为云社区<运行npm install命令的时候会发生什 ...

  10. -5.C++读入一行字符串

    -5.C++读入一行字符串 cin.getline(char * str, int size_t, char delim) 头文件: #include<iostream> 参数1:字符数组 ...