题意:
给你一个数a<=1e18和k次操作,每次你能将一个数向相邻两边移动,问你通过k次移使a最大。
思路:
要使数最大,那么要在后面找一位大的数来替换前面小的数,这样我们从前面开始,每次从后面找能够通过k次移动的最大的那个数,然后将它移到前面来。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef __int64 LL;
LL a;
int k,cnt,d[20];
int main(){
scanf("%I64d%d",&a,&k);
cnt=0;
while(a){
d[cnt++]=a%10;
a/=10;
}
for(int i=cnt-1;i>=0;i--){
int Max=d[i],index=i;
for(int j=i-1;j>=max(i-k,0);j--){
if(Max<d[j]){
Max=d[j];
index=j;
}
}
k-=(i-index);
for(int j=index;j<i;j++){
swap(d[j],d[j+1]);
}
}
for(int i=cnt-1;i>=0;i--){
printf("%d",d[i]);
}
printf("\n");
return 0;
}