标签:
以前做贪心题目都第一步对数据进行从大到小的排序,大部分贪心题目的的处理方法也是这样。但是NYOJ的1057题,在解题中
并不需要排序,一时间都没有意识到是贪心题。在看了讨论区之后意识到要用贪心的思想,才解出题目。认识到贪心算法并非是排序后再处理的机械操作,而是从局部寻求最优解的思想。
原题如下:
给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。
求这个新的整数的最大值是多少。
1990 1 100 0 9090000078001234 6
9190 100 9907000008001234
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int n,t,i,k,len;
char max,str[100];
while(scanf("%s%d",str,&k)!=EOF)
{
len=strlen(str);
t=0;//t标记每次交换开始的首位置
while(k>0)
{
if(t==len)
break;
n=t;//用n标记每次交换开始时的用于交换部分的首字符
for(i=t;i<=t+k;i++)
{
if(i>=len)
break;
if(str[i]>str[n])
n=i;//遇到字符数大的字符时,用n标记下来。
}
if(n!=t)
{
max=str[n];
for(i=n;i>t;i--)
str[i]=str[i-1];
str[t]=max;
k-=n-t;//等于k=k-(n-t);
}
t++;
}
printf("%s\n",str);
}
return 0;
}标签:
原文地址:http://blog.csdn.net/zwj1452267376/article/details/42678241