洛谷P2525 Uim的情人节礼物·其之壱(组合数学/上一个全排列/下一个全排列)
題目
給定長度為n(n<=9)的全排列,
輸出比該全排列上一個字典序的全排列,
不存在輸出ERROR
思路來源
https://www.luogu.com.cn/problemnew/solution/P2525
題解
組合數(shù)學(xué)惡補第二彈,orz這個可是洛谷入門題
考慮上一個字典序,一定出現(xiàn)在某一位比當前全排列小了,且是最靠后的一位
對于相鄰的正序?qū)?#xff0c;無法交換其順序,所以一定是從后往前的第一個逆序?qū)?/p>
若a[i-1]>a[i],則可以把a[i-1]調(diào)小,變成字典序更小的全排列,
所以找到范圍內(nèi)滿足a[x]<a[i-1]且值最大的那個位置x,將其與a[i-1]交換,
交換之后,起到了降字典序的目的,后面的數(shù)應(yīng)降序排列,使當前的字典序最大
代碼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]的最大的 從最小的逆序一位開始調(diào)小 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水,調(diào)用該函數(shù),若上一個全排列存在,則會使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; }后續(xù)(2021.5.7)
下一個全排列類似,可以參考1850. 鄰位交換的最小次數(shù)
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,而是應(yīng)該交換6,即從后往前第一對正序?qū)?/p> 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']
?
總結(jié)
以上是生活随笔為你收集整理的洛谷P2525 Uim的情人节礼物·其之壱(组合数学/上一个全排列/下一个全排列)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [js] document.domai
- 下一篇: Ubuntu64位安装Adobe Rea