寻找最大数(三)
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。
求这个新的整数的最大值是多少。
-
输入
-
多组测试数据。
每组测试数据占一行,每行有两个数N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100).
输出
- 每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。 样例输入
-
1990 1 100 0 9090000078001234 6
样例输出
-
9190 100 9907000008001234
来源
- 原创 上传者
- TC_李远航
-
- 思路:在字符串上,循环在K的范围内寻找最大值,然后使最大值到每次循环开始处,并使K自减去交换的次数。直至k==0;
-
-
#include<stdio.h>
#include<string.h>
#include<map>
#include<algorithm>
using namespace std;
int main()
{
char a[50];
int k;
while(~scanf("%s%d",a,&k))
{
int la=strlen(a);
int maxx,flag,h,book=0;
char temp;
if(k==0)
{
printf("%s\n",a);
continue;
}
for(int i=0;i<la;i++) // 在字符串上
{
maxx=a[i];
book=0;
for(int j=i;j<=i+k&&j<la;j++) //在K的范围内找最大值;
{
if(a[j]>maxx)
{
maxx=a[j];
flag=j;
book=1;
}
}
if(book)
{
for(int h=flag;h>i;h--) //一步步交换字符,使最大值到此次循环开始处;
{
temp=a[h];
a[h]=a[h-1];
a[h-1]=temp;
}
k=k-flag+i; // k自减去交换步数;
}
if(k==0)
break; //k==0,结束循环;
}
printf("%s\n",a);
memset(a,0,sizeof(a));
}
}
-
多组测试数据。