题目

给定长度为n(n<=9)的全排列,

输出比该全排列上一个字典序的全排列,

不存在输出ERROR

思路来源

https://www.luogu.com.cn/problemnew/solution/P2525

题解

组合数学恶补第二弹,orz这个可是洛谷入门题

考虑上一个字典序,一定出现在某一位比当前全排列小了,且是最靠后的一位

对于相邻的正序对,无法交换其顺序,所以一定是从后往前的第一个逆序对

若a[i-1]>a[i],则可以把a[i-1]调小,变成字典序更小的全排列,

所以找到范围内满足a[x]<a[i-1]且值最大的那个位置x,将其与a[i-1]交换,

交换之后,起到了降字典序的目的,后面的数应降序排列,使当前的字典序最大

代码1

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=10;
int n,a[N],b[N],cnt;
bool ok;
void solve(int x){//[x,n)int mx=-1,pos=-1;for(int i=x+1;i<n;++i){//<a[x]的最大的 从最小的逆序一位开始调小 if(a[i]<a[x]){if(a[i]>mx){mx=a[i];pos=i;}}}swap(a[pos],a[x]);sort(a+x+1,a+n,greater<int>());//后面的降序即可 表示此时的最大
}
int main(){scanf("%d",&n); for(int i=0;i<n;++i){scanf("%d",&a[i]);}for(int i=n-1;i;--i){if(a[i-1]>a[i]){solve(i-1);for(int j=0;j<n;++j){printf("%d%c",a[j]," \n"[j==n-1]);}ok=1;break;}}if(!ok)puts("ERROR");return 0;
}

代码2(prev_permutation)

用STL水,调用该函数,若上一个全排列存在,则会使ai变成上一个全排列,否则返回假

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N=10;
int n,a[N],b[N],cnt;
int main(){scanf("%d",&n); for(int i=0;i<n;++i){scanf("%d",&a[i]);}if(!prev_permutation(a,a+n))puts("ERROR");else{for(int i=0;i<n;++i){printf("%d%c",a[i]," \n"[i==n-1]);}}return 0;
}

后续(2021.5.7)

下一个全排列类似,可以参考1850. 邻位交换的最小次数

class Solution:def getMinSwaps(self, num: str, k: int) -> int:def getnext(nums):n = len(nums)for i in range(n-2,-1,-1):if nums[i]<nums[i+1]:mn, pos = '9', -1for j in range(i+1,n):if num[j]>nums[i]:if mn > nums[i]:mn, pos = nums[j], j nums[i],nums[pos] = nums[pos],nums[i]nums[i+1:n] = sorted(nums[i+1:n])return numstmp = list(num)num = list(num)n = len(num)ans = 0for i in range(k):num = getnext(num)# print(num)for i in range(n):if tmp[i] == num[i]:continuepos = -1for j in range(i+1,n):if num[j] == tmp[i]:pos = jbreakfor j in range(pos,i,-1):num[j],num[j-1] = num[j-1],num[j]ans += 1return ans
['9', '4', '8', '6', '5', '3']
['9', '5', '3', '4', '6', '8']
['9', '5', '3', '4', '8', '6']
['9', '5', '3', '6', '4', '8']
['9', '5', '3', '6', '8', '4']
['9', '5', '3', '8', '4', '6']
['9', '5', '3', '8', '6', '4']
['9', '5', '4', '3', '6', '8']
['9', '5', '4', '3', '8', '6']
['9', '5', '4', '6', '3', '8']
['9', '5', '4', '6', '8', '3']
['9', '5', '4', '8', '3', '6']
['9', '5', '4', '8', '6', '3']
['9', '5', '6', '3', '4', '8']
['9', '5', '6', '3', '8', '4']
['9', '5', '6', '4', '3', '8']
['9', '5', '6', '4', '8', '3']
['9', '5', '6', '8', '3', '4']
['9', '5', '6', '8', '4', '3']
['9', '5', '8', '3', '4', '6']
['9', '5', '8', '3', '6', '4']
['9', '5', '8', '4', '3', '6']
['9', '5', '8', '4', '6', '3']
['9', '5', '8', '6', '3', '4']
['9', '5', '8', '6', '4', '3']
['9', '6', '3', '4', '5', '8']
['9', '6', '3', '4', '8', '5']
['9', '6', '3', '5', '4', '8']
['9', '6', '3', '5', '8', '4']
['9', '6', '3', '8', '4', '5']
['9', '6', '3', '8', '5', '4']
['9', '6', '4', '3', '5', '8']
['9', '6', '4', '3', '8', '5']
['9', '6', '4', '5', '3', '8']
['9', '6', '4', '5', '8', '3']
['9', '6', '4', '8', '3', '5']
['9', '6', '4', '8', '5', '3']
['9', '6', '5', '3', '4', '8']
['9', '6', '5', '3', '8', '4']
['9', '6', '5', '4', '3', '8']
['9', '6', '5', '4', '8', '3']
['9', '6', '5', '8', '3', '4']
['9', '6', '5', '8', '4', '3']
['9', '6', '8', '3', '4', '5']
['9', '6', '8', '3', '5', '4']
['9', '6', '8', '4', '3', '5']
['9', '6', '8', '4', '5', '3']
['9', '6', '8', '5', '3', '4']
['9', '6', '8', '5', '4', '3']
['9', '8', '3', '4', '5', '6']
['9', '8', '3', '4', '6', '5']
['9', '8', '3', '5', '4', '6']
['9', '8', '3', '5', '6', '4']
['9', '8', '3', '6', '4', '5']
['9', '8', '3', '6', '5', '4']
['9', '8', '4', '3', '5', '6']
['9', '8', '4', '3', '6', '5']
['9', '8', '4', '5', '3', '6']
['9', '8', '4', '5', '6', '3']
['9', '8', '4', '6', '3', '5']
['9', '8', '4', '6', '5', '3']
['9', '8', '5', '3', '4', '6']
['9', '8', '5', '3', '6', '4']
['9', '8', '5', '4', '3', '6']

注意,以下方法是不行的,反例是v=948635,k=64,此时3684找不到下一个后继3846,

所以不能从末尾往前扫交换4,而是应该交换6,即从后往前第一对正序对

class Solution:def getMinSwaps(self, num: str, k: int) -> int:def getnext(nums):n = len(nums)ok = Falsefor i in range(n-1,-1,-1):if ok:breakfor j in range(i-1,-1,-1):if ok:breakif nums[j] < nums[i]:num[j],num[i] = num[i],num[j]ok = Truenums[j+1:n] = sorted(nums[j+1:n])return numstmp = list(num)num = list(num)n = len(num)ans = 0for i in range(k):num = getnext(num)print(num)for i in range(n):if tmp[i] == num[i]:continueprint(i)pos = -1for j in range(i+1,n):if num[j] == tmp[i]:pos = jbreakfor j in range(pos,i,-1):num[j],num[j-1] = num[j-1],num[j]ans += 1return ans
['9', '4', '8', '6', '5', '3']
['9', '5', '3', '4', '6', '8']
['9', '5', '3', '4', '8', '6']
['9', '5', '3', '6', '4', '8']
['9', '5', '3', '6', '8', '4']
['9', '5', '4', '3', '6', '8']
['9', '5', '4', '3', '8', '6']
['9', '5', '4', '6', '3', '8']
['9', '5', '4', '6', '8', '3']
['9', '5', '4', '8', '3', '6']
['9', '5', '4', '8', '6', '3']
['9', '5', '6', '3', '4', '8']
['9', '5', '6', '3', '8', '4']
['9', '5', '6', '4', '3', '8']
['9', '5', '6', '4', '8', '3']
['9', '5', '6', '8', '3', '4']
['9', '5', '6', '8', '4', '3']
['9', '5', '8', '3', '4', '6']
['9', '5', '8', '3', '6', '4']
['9', '5', '8', '4', '3', '6']
['9', '5', '8', '4', '6', '3']
['9', '5', '8', '6', '3', '4']
['9', '5', '8', '6', '4', '3']
['9', '6', '3', '4', '5', '8']
['9', '6', '3', '4', '8', '5']
['9', '6', '3', '5', '4', '8']
['9', '6', '3', '5', '8', '4']
['9', '6', '4', '3', '5', '8']
['9', '6', '4', '3', '8', '5']
['9', '6', '4', '5', '3', '8']
['9', '6', '4', '5', '8', '3']
['9', '6', '4', '8', '3', '5']
['9', '6', '4', '8', '5', '3']
['9', '6', '5', '3', '4', '8']
['9', '6', '5', '3', '8', '4']
['9', '6', '5', '4', '3', '8']
['9', '6', '5', '4', '8', '3']
['9', '6', '5', '8', '3', '4']
['9', '6', '5', '8', '4', '3']
['9', '6', '8', '3', '4', '5']
['9', '6', '8', '3', '5', '4']
['9', '6', '8', '4', '3', '5']
['9', '6', '8', '4', '5', '3']
['9', '6', '8', '5', '3', '4']
['9', '6', '8', '5', '4', '3']
['9', '8', '3', '4', '5', '6']
['9', '8', '3', '4', '6', '5']
['9', '8', '3', '5', '4', '6']
['9', '8', '3', '5', '6', '4']
['9', '8', '4', '3', '5', '6']
['9', '8', '4', '3', '6', '5']
['9', '8', '4', '5', '3', '6']
['9', '8', '4', '5', '6', '3']
['9', '8', '4', '6', '3', '5']
['9', '8', '4', '6', '5', '3']
['9', '8', '5', '3', '4', '6']
['9', '8', '5', '3', '6', '4']
['9', '8', '5', '4', '3', '6']
['9', '8', '5', '4', '6', '3']
['9', '8', '5', '6', '3', '4']
['9', '8', '5', '6', '4', '3']
['9', '8', '6', '3', '4', '5']
['9', '8', '6', '3', '5', '4']
['9', '8', '6', '4', '3', '5']

洛谷P2525 Uim的情人节礼物·其之壱(组合数学/上一个全排列/下一个全排列)相关推荐

  1. 洛谷——P2525 Uim的情人节礼物·其之壱

    P2525 Uim的情人节礼物·其之壱 题目描述 情人节到了,Uim打算给他的后宫们准备情人节礼物.UIm一共有N(1<=N<=9)个后宫妹子(现充去死 挫骨扬灰!). 为了维护他的后宫的 ...

  2. [洛谷]P2525 Uim的情人节礼物·其之壱

    这题我们只需要判断当前这个序列是否存在上一个字典序即可,这里可以用到一个叫做prev_permutation(a,a+n)的一个函数,它可以用来输出上一个序列,所以只需要用它判断一下是否存在上一个字典 ...

  3. 洛谷:P2525 Uim的情人节礼物·其之壱

    洛谷:P2525 Uim的情人节礼物·其之壱:题目链接 题解:利用C++的prev_permutation函数:可以求出给定数组的上一个字典序排序. #include <bits/stdc++. ...

  4. 【寒假每日一题】luogu P2525 Uim的情人节礼物·其之壱

    题目链接:P2525 Uim的情人节礼物·其之壱 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述 情人节到了,Uim打算给他的后宫们准备情人节礼物.UIm一共有N(1< ...

  5. 洛谷——P2524 Uim的情人节礼物·其之弐

    P2524 Uim的情人节礼物·其之弐 题目描述 前传:详见洛谷P2525 Uim成功地按照顺序将礼物送到了N个妹子的手里并维持她们的和谐. Uim现在想知道,他最终选择的顺序是所有给N个妹子送礼顺序 ...

  6. 洛谷算法题单:模拟与高精度例题(上)

    一:模拟 想要利用计算机解决现实生活中的一些复杂的问题时,建立模型是解决问题的关键. 举个生活中常见的例子:我们拿到了某次数学考试的成绩单,现在需要知道谁考得最好.当然不能把成绩单对着电脑晃一晃,然后 ...

  7. Uim的情人节礼物·其之弐(洛谷-P2524)

    题目描述 Uim成功地按照顺序将礼物送到了N个妹子的手里并维持她们的和谐. Uim现在想知道,他最终选择的顺序是所有给N个妹子送礼顺序中.字典序第几小的. 输入输出格式 输入格式: 第一行一个整数N, ...

  8. 生成指定序列的前一字典序序列(洛谷P2525题题解,C++语言描述)

    题目要求 P2525题目链接 分析 C++的STL中的prev_permutation函数可以生成前一个排列. 如果可以生成,则返回true,并可以直接用生成的序列:已经为第一个,则返回false. ...

  9. 洛谷P3270:成绩比较(容斥、组合数学)

    解析 依然不会亚qwq 但这次至少有点上道了 (指推出了一个会导致重复计数的错误式子) 首先,我们要选出碾压那些人,方案数就是Cn−1kC_{n-1}^kCn−1k​ 然后,我们要统计每门学科的排名情 ...

  10. 烦神的斐波那契洛谷-1306-斐波那契公约数

    传送门 洛谷1306传送门 -------------------------------------------------------------------------------------- ...

最新文章

  1. document.location的用法实例(摘抄自博客园--KoMiles,自己学习的时候记录一下)...
  2. 电路的静态与动态特性
  3. 英雄探长的机器人怎么拼_LOL路人局都畏惧的辅助英雄,新版机器人布里兹上手指南...
  4. Java Comparator 珍藏版
  5. ajax状态码--转他人的
  6. CentOS创建快捷按钮并设置文件图标
  7. mysql cte 语法,mysql8 公用表表达式CTE的使用方法实例分析
  8. u盘安装linux 提示no such device_树莓派学习笔记2-U盘挂载和系统备份
  9. IOT(Index Organized Table)
  10. 前端学习(2821):windows上配置tabber字段
  11. 【转】C#、面向对象、设计模式学习
  12. 不简单的工厂:实际体验 .NET Core 2.1 新生物 HttpClientFactory
  13. 程序员的数学【线性代数高级】
  14. MATLAB疲劳检测系统
  15. webservice的接口测试工具
  16. android剪贴板历史,可能是史上最便捷的剪贴板应用 -- Native Clipboard #Android
  17. UVA-10246 - Asterix and Obelix(dijkstra)
  18. 小米pro蓝牙驱动linux,【小米笔记本蓝牙驱动下载】小米笔记本蓝牙驱动程序官方下载 V20.11 通用版-七喜软件园...
  19. mysql 怎么区分大小写_MYSQL区分大小写
  20. clc和clear命令的使用

热门文章

  1. python爬虫qq音乐_Python爬虫实战:采集全部QQ音乐歌曲
  2. 两个平面的位置关系和判定方程组解_精品获奖教案 1.2.4平面与平面的位置关系(2)教案 苏教版必修2...
  3. 用户故事与敏捷方法—用户故事不良症兆
  4. 计算机组成原理强制类型转换规则,计算机组成原理——浮点数加减运算强制类型转换...
  5. eslint / prettier 检查格式配置、husky / lint-staged 强制校验、tslint 配置
  6. java项目源码分享_ssm项目分享600套
  7. ppt设置外观样式_ppt如何设置幻灯片的样式
  8. curviloft插件怎么用_Curviloft插件下载
  9. html界面嵌入网易云,使用flex进行网易云音乐界面构建和布局解析(1)
  10. OpenCV(VS2019)——无法打开“opencv2/opencv.hpp”文件