这道题折磨了我两天半 一开始没思路后来有了思路 但不是很清晰很彻底 导致程序一直写不对
此题的贪心策略就是从头开始 一步一步的来 每一步找到当前所剩步数下的最大数字,与前面的数字进行交换,换到当前位置上
记住是每一次,确定一个位子上的值该放哪个 一个位子一个位子的确定
#include <stdio.h>
#include <string.h>
char a[21];
int main()
{
int k;
while(~scanf("%s%d",a,&k))
{
int len=strlen(a);
int m,i,j,p,max,n;
char t;
if(k==0)
{
puts(a);
continue;
}
for(i=0;i<len;i++)
{
m=a[i];//要记得一件事 一步一步的 每一步确定一个位子上的数,替换成可换步数里最大的数字 我一开始忘了这个最根本的点 导致有思路 程序却写不出来
max=i;//最大值的下标
n=1;//标记 若后面的值都没有此时的大 就不必进行换位操作
for(j=i+1;j<=i+k&&j<len;j++)
{
if(m<a[j])
{
m=a[j];
max=j;
n=0;
}
}
if(!n)
{
for(p=max;p>=i+1;p--)
{
t=a[p];
a[p]=a[p-1];
a[p-1]=t;
}
k=k-max+i;//计算还剩下几步操作
}
if(k==0)
break;
}
printf("%s\n",a);
}
return 0;
}