P2525 Uim的情人节礼物·其之壱 【字典序】【STL:prev_permutation】
生活随笔
收集整理的這篇文章主要介紹了
P2525 Uim的情人节礼物·其之壱 【字典序】【STL:prev_permutation】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
情人節到了,Uim打算給他的后宮們準備情人節禮物。UIm一共有N(1<=N<=9)個后宮妹子(現充去死 挫骨揚灰!)。
為了維護他的后宮的穩定。他通過編程,得出了一個送禮物的最佳順序。這個我們管不著。
然而他認為,如果什么事情做得太圓滿不是什么好事。于是他希望得到 原定順序 的 前一個字典序的序列。
輸入格式
第一行一個整數N
第二行N個整數,表示原定排列
輸出格式
前一個排列
輸入輸出樣例
輸入 #1
3 1 3 2輸出 #1
1 2 3說明/提示
若當前排列已經是第一個,則輸出'ERROR'(引號不輸出)
[del]騙分?嗯哼哼。。。[/del]
/* 方法一:用STL的一個函數: prev_permutation() 就可以自動制造前一個排列 */#include <bits/stdc++.h> using namespace std; const int N=1e4+10; int a[N]; int main() {int n;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]<<" ";} }else cout<<"ERROR";cout<<endl;return 0; } /* 方法二:理解本質 首先,理解一下: 字典序如果在長度相等的序列中。 要逐位比較大小每次做這種題目,都很難腦補: 不妨先 列舉 1,2,3的字典序排列吧 1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1再枚舉1,2,3,4的 1,2,3,4 1,2,4,3 1,3,2,4 1,3,4,2 1,4,2,3 1,4,3,2 2,1,3,4 2,1,4,3 ...... 3,1,2,4 3,1,4,2 3,2,1,4 3,2,4,1 ..... 舉個例子, 拿1,4,2,3來說, (4的后面找一個(比4小的)最大的放在4的位置,其余的往后從大到小排****) 它的前一個是 1,3,4,2而對于 1,4,3,2來說 (3后面找一個最大的放在3的位置,....) 它的前一個是 1,4,2,3上述的例子第一個數都是1下面舉個特殊的例子,第一個數字不一樣的 比如2,1,3,4 (發生ai>ai+1 的 i是1,在第一個位置,說明上一個字典序的首元素不一樣了) 前一個1,4,3,2 (第一個位置放比2小的最大的,后面的從大道小排) [如果把上述第一個數字一樣的,去掉第一個數字比如1,4,2,3=>1,3,4,2] [就會變成,4,2,3=>3,4,2] 上述的例子都是一樣的,在pos之后找一個比pos位置上的數小的最大的數 然后包括pos以及之后位置上的數從大到小排 *//* 7 4 3 2 6 1 5 7 輸出: 4 3 2 5 7 6 1 */#include <bits/stdc++.h> using namespace std; const int N=20; int a[N];bool cmp(int a,int b) {return a>b; } int main() {int n;cin>>n;for(int i=1;i<=n;i++)cin>>a[i];int pos=-1;for(int i=n;i>=2;i--){if(a[i]<a[i-1]){pos=i-1;break;}}if(pos==-1) puts("ERROR");else{int maxv2=-1;int pos2=-1;for(int i=pos+1;i<=n;i++){if(a[i]<a[pos]&&a[i]>maxv2){pos2=i;maxv2=a[i];}}swap(a[pos],a[pos2]);sort(a+1+pos,a+1+n,cmp);for(int i=1;i<=n;i++){cout<<a[i]<<" ";}cout<<endl;}return 0; }?
總結
以上是生活随笔為你收集整理的P2525 Uim的情人节礼物·其之壱 【字典序】【STL:prev_permutation】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [css] 举例说明你对指针事件(po
- 下一篇: 前端学习(2823):sitemap配置