思路:贪心。从高位开始,找到比这一位大的且能在k次交换之内交换到这一位的最大一位数,那这个数交换到这一位,k减去相应的交换次数。这样就保证了高位尽可能大,也就保证了交换后的数尽可能大。
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define pb push_back const int INF=0x3f3f3f3f; const int N=105; int d[N]; int main() { ios::sync_with_stdio(false); cin.tie(0); ll a; int k; cin>>a>>k; for(int i=0;i<18;i++) { d[i]=a%10; a/=10; } int c=17; while(!d[c])c--; for(int i=c;i>0;i--) { int n=d[i]; int index=i; for(int j=i-1;j>=0&&i-j<=k;j--) { if(d[j]>n) { n=d[j]; index=j; } } for(int j=index;j<i;j++)swap(d[j],d[j+1]); k-=i-index; } ll ans=0; for(int i=c;i>=0;i--)ans=ans*10+d[i]; cout<<ans<<endl; return 0; }