洛谷 P2525 Uim的情人节礼物·其之壱
题目描述
情人节到了,Uim打算给他的后宫们准备情人节礼物。UIm一共有N(1<=N<=9)个后宫妹子(现充去死 挫骨扬灰!)。
为了维护他的后宫的稳定。他通过编程,得出了一个送礼物的最佳顺序。这个我们管不着。
然而他认为,如果什么事情做得太圆满不是什么好事。于是他希望得到 原定顺序 的 前一个字典序的序列。
输入格式
第一行一个整数N
第二行N个整数,表示原定排列
输出格式
前一个排列
源代码
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; }
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 }