NYOJ 1057 寻找最大数(三)(关于贪心算法的认识)
2015-01-13 16:23
246 查看
以前做贪心题目都第一步对数据进行从大到小的排序,大部分贪心题目的的处理方法也是这样。但是NYOJ的1057题,在解题中
并不需要排序,一时间都没有意识到是贪心题。在看了讨论区之后意识到要用贪心的思想,才解出题目。认识到贪心算法并非是排序后再处理的机械操作,而是从局部寻求最优解的思想。
原题如下:
时间限制:1000 ms | 内存限制:65535 KB
难度:2
描述
给出一个整数N,每次可以移动2个相邻数位上的数字,最多移动K次,得到一个新的整数。
求这个新的整数的最大值是多少。
输入
多组测试数据。
每组测试数据占一行,每行有两个数N和K (1 ≤ N≤ 10^18; 0 ≤ K ≤ 100).
输出
每组测试数据的输出占一行,输出移动后得到的新的整数的最大值。
样例输入
样例输出
代码如下:
并不需要排序,一时间都没有意识到是贪心题。在看了讨论区之后意识到要用贪心的思想,才解出题目。认识到贪心算法并非是排序后再处理的机械操作,而是从局部寻求最优解的思想。
原题如下:
寻找最大数(三)
时间限制: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=i;//遇到字符数大的字符时,用n标记下来。 } if(n!=t) { max=str ; 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 寻找最大数(三)贪心算法
- 贪心算法--寻找最大数(一)
- 贪心算法之寻找最大数
- 贪心算法--寻找最大数(三)
- NYOJ 448 寻找最大数(贪心算法)
- NYOJ 1057 寻找最大数(三)
- XYNUOJ 1255 寻找最大数—贪心算法
- 关于DropDownList绑定数据的一点认识
- 关于场景的认识
- 关于AJAX.NET 的一点认识
- 关于Linux下C语言编译器gcc不认识bool类型的问题
- 关于COM的一些浅显的认识(读书笔记)
- 关于编码的一些认识和理解(Kemin原创)
- 关于文本框单行 多行 最大长度判断的问题
- 关于.Net中ThreadPool的一些认识
- 关于CRM的理解和认识
- 我要开发一个关于宠物管理方面的系统,急寻找开发人员~~~~
- 关于Editor和Renderer的一点认识
- 三个关于计算机科学的最大真理(zt)
- 部落纪事: 一条关于求统计分组的最大值的sql