首页 > 代码库 > NYOJ 1057 寻找最大数(三)(关于贪心算法的认识)

NYOJ 1057 寻找最大数(三)(关于贪心算法的认识)

      以前做贪心题目都第一步对数据进行从大到小的排序,大部分贪心题目的的处理方法也是这样。但是NYOJ的1057题,在解题中

并不需要排序,一时间都没有意识到是贪心题。在看了讨论区之后意识到要用贪心的思想,才解出题目。认识到贪心算法并非是排序后再处理的机械操作,而是从局部寻求最优解的思想。

原题如下:


寻找最大数(三)

时间限制: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

代码如下:

#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;
}




NYOJ 1057 寻找最大数(三)(关于贪心算法的认识)