HDU 3183 贪心
2016-03-13 14:11
190 查看
给出一个数n 再给一个数m 问 在n中拿掉m个数 n最小多少
n用字符串来存 最多1000位
思想是 最后会留下n-m位 所以从后往前看 从n-m+1位往前看 取最小的一个值 让它做第一位
然后将这个值的位子标记 以后只看到标记的位子就break
这样可以保证第一位是可以选的最小的 由于第一位在让n变小的重要性大于第二位及以后 所以后面的都要迁就前面的 故遇到标记 即已经到了前一位的地方 就break出来
需要注意的是当某一位选择最小值的时候 应该尽量往前面选 即使值一样小 这样可以给后面的开辟空间
n用字符串来存 最多1000位
思想是 最后会留下n-m位 所以从后往前看 从n-m+1位往前看 取最小的一个值 让它做第一位
然后将这个值的位子标记 以后只看到标记的位子就break
这样可以保证第一位是可以选的最小的 由于第一位在让n变小的重要性大于第二位及以后 所以后面的都要迁就前面的 故遇到标记 即已经到了前一位的地方 就break出来
需要注意的是当某一位选择最小值的时候 应该尽量往前面选 即使值一样小 这样可以给后面的开辟空间
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> #include<queue> using namespace std; char s[1005]; int n,m; char ans[1005]; bool ok[1005]; int main(){ while(~scanf("%s",s)) { int len=strlen(s); int xiabiao=len-1; scanf("%d",&n); m=len-n; m=(xiabiao-m+1); int w=0; memset(ok,true,sizeof(ok)); for(int i=m;i<=len-1;i++) { char minn=s[i]; int where=i; for(int k=i;k>=0;k--) { if(ok[k]==false) break; if(s[k]<=minn) { minn=s[k]; where=k; } } ok[where]=false; ans[w++]=minn; } bool qiandao=true; for(int i=0;i<w;i++) { if(ans[i]!='0') qiandao=false; if(!qiandao) printf("%c",ans[i]); } if(qiandao==true) printf("0"); printf("\n"); } }
相关文章推荐
- Android GestureDetector使用详解
- Spring AOP 实现原理与 CGLIB 应用
- Unity5中lightmap的坑
- nginx禁止访问某个文件和目录(文件夹)
- MySQL数据库总结(10)存储引擎与事务处理
- javascript的垃圾回收机制
- Java中的continue、break和return
- 【CodeForces19E】Fairy
- activemq中的订阅模式以及消息时长和确认机制
- 20145216史婧瑶《Java程序设计》第2周学习总结
- 第2周项目1—个人所得税计算器
- [Splay] BZOJ 3729 Gty的游戏
- 20145216史婧瑶《Java程序设计》第2周学习总结
- 伽利略对自由落体运动的研究
- 第二周学习进度
- VS2012 配置 OpenCV3.0
- Python学习之分布式进程初探(1)
- GNU/Linux下用户、组及权限管理
- 第3周-项目4-三色球问题
- Programming Exercise 7:K-means Clustering and Principal Component Analysis 第一部分