以前做贪心题目都第一步对数据进行从大到小的排序,大部分贪心题目的的处理方法也是这样。但是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; }
时间: 2024-10-10 02:49:05