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

题目描述

情人节到了,Uim打算给他的后宫们准备情人节礼物。UIm一共有N(1<=N<=9)个后宫妹子(现充去死 挫骨扬灰!)。

为了维护他的后宫的稳定。他通过编程,得出了一个送礼物的最佳顺序。这个我们管不着。

然而他认为,如果什么事情做得太圆满不是什么好事。于是他希望得到 原定顺序 的 前一个字典序的序列。

输入格式

第一行一个整数N

第二行N个整数,表示原定排列

输出格式

前一个排列

源代码

#include<bits/stdc++.h>usingnamespacestd; int n,a[10000]; int main() { cin>>n; for(int i=0;i<n;i++) cin>>a[i]; if(prev_permutation(a,a+n)) for(int i=0;i<n;i++) cout<<a[i]<<" "; elsecout<<"ERROR"; cout<<endl; return0; }

这道题的代码中最核心的部分就是prev_permutation(a,a+n)

next_permutation(start,end),和prev_permutation(start,end)。这两个函数作用是一样的,区别就在于前者求的是当前排列的下一个排列,后一个求的是当前排列的上一个排列。至于这里的“前一个”和“后一个”,我们可以把它理解为序列的字典序的前后,严格来讲,就是对于当前序列pn,他的下一个序列pn+1满足:不存在另外的序列pm,使pn<pm<pn+1。

所以可以用if进行判断,当当前序列不存在下一个排列时,函数返回false,否则返回true。

next_permutation(num,num+n)函数是对数组num中的前n个元素进行全排列,同时并改变num数组的值。

注:next_permutation()在使用前需要对欲排列数组按升序排序,否则只能找出该序列之后的全排列数。

之后只要输出得到的第一组排列即可。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,a[10000];
 4 int main()
 5 {
 6     cin>>n;
 7     for(int i=0;i<n;i++)
 8         cin>>a[i];
 9     if(prev_permutation(a,a+n)) 
10         for(int i=0;i<n;i++)
11             cout<<a[i]<<" ";
12     else cout<<"ERROR";  
13     cout<<endl;
14     return 0;
15 }
原文地址:https://www.cnblogs.com/jd1412/p/12396620.html