2145: 寻找最大数(三)
时间限制: 1 Sec 内存限制: 64 MB
提交: 8 解决: 5
您该题的状态:已完成
[提交][状态][讨论版]
题目描述
给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。
求这个新的整数的最大值是多少。
输入
多组测试数据。 每组测试数据占一行,每行有两个数N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100).
输出
每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。
样例输入
1990 1
100 0
9090000078001234 6
样例输出
9190
100
9907000008001234
#include <stdio.h>
#include <string.h>
void findmax(char c[],int k)//每次从flag1-flag2之间找到一个最大数,把其移动到flag1的位置
{ //直到步数用完,或已经为最大数
int flag1,flag2,r,max;
int len=strlen(c);
flag1=0;//falg1的起始位置为0
if(k>=len-1)
flag2=len-1;//flag2为len-1,即从整个字符串中选一个最大数,把其依次移动到首位
else
flag2=k;//若步数不够,flag2=k
while(k)
{
r=0;//r用来记录是否已经为最大数
max=flag1;
for(int i=flag1;i<=flag2;i++)//从flag1-flag2之间找到一个最大数c[max]
if(c[max]<c[i])
max=i;
for(int i=max;i>flag1;i--)//把c[max]移动到flag1的位置
{
int t;
t=c[i];
c[i]=c[i-1];
c[i-1]=t;
k--; //每移动一次,k减1
r=1;
}
if(r==0 && flag1==len-1)
break;
flag1++; //每就位一个数,flag1加1
if(flag1+k<len-1)
flag2=flag1+k;
}
}
int main()
{
char c[25];
int k;
while(scanf("%s %d",c,&k)!=EOF)
{
findmax(c,k);//c为存储N的数组,k为可以移动的步数
printf("%s\n",c);
}
return 0;
}