首页 > 代码库 > 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 寻找最大数(三)(关于贪心算法的认识)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。