UVA 11491
2015-09-03 22:30
211 查看
有个N位数,删掉D位,使得剩下来的数字数值最大。
反过来想,把这个数列拼成N-D位数。由于数的大小,越高位越大越好,所以这个题是个典型的贪心算法。
比如这个例子 69852 要留下个三位数。
因为5 和 2 不可能成为最高位,所以这两位不用遍历。
然后从头开始遍历,发现9最大。
下次就从8开始遍历,发现2不可能成为第二位,以此类推。
最后得出结果985。
一开始卡了TLE,后来改进了一下 0.75S过了,还是有点冒险。
反过来想,把这个数列拼成N-D位数。由于数的大小,越高位越大越好,所以这个题是个典型的贪心算法。
比如这个例子 69852 要留下个三位数。
因为5 和 2 不可能成为最高位,所以这两位不用遍历。
然后从头开始遍历,发现9最大。
下次就从8开始遍历,发现2不可能成为第二位,以此类推。
最后得出结果985。
一开始卡了TLE,后来改进了一下 0.75S过了,还是有点冒险。
#include<iostream> #include<algorithm> #include<vector> #include<string.h> using namespace std; int input; char save[100100]={0}; vector<char> ans; int main() { int n; int del; while(cin>>n>>del) { if(n==0 && del==0) break; cin>>save; int d=n-del; int sign=0; int i=0; int start_d=d; char max; while(true) { int start; if(start_d==d) //如果是第一次的话,把头设置成开始点,和最大点 { max=save[0]; start=0; } else //不是第一次的话,就是刚刚找出的那个最大值的下一位 { max=save[sign+1]; start=sign+1; sign=start; //这句很关键,处理如果后面没有比他大的情况下 } for(i=start;i<n-(start_d-1);i++) { if(save[i]>max) { sign=i; max=save[i]; } } ans.push_back(max); start_d--; if(start_d==0) break; } for(i=0;i<ans.size();i++) { printf("%c",ans[i]); } cout<<endl; ans.clear(); } return 0; }
相关文章推荐
- Python 集合set
- Quartz.net Cron表达式
- 著名的黑客站点
- 在python3中使用urllib.request编写简单的网络爬虫
- random函数
- BZOJ 1059 矩阵游戏 (二分图最大匹配)
- CF 558 A. Lala Land and Apple Trees
- HDU 3065 AC自动机
- C语言中经常遇到的 segmentation fault 错误
- iOS开发之UI基础--三种简单的动画设置
- Reverse Words in a String
- C++产生不重复的随机数
- 高性能Tomcat:漫谈行走在sendfile之上的Tomcat
- 访问google的一些方法
- HDU 2896-病毒侵袭(ac自动机)
- 统计信息
- 1553 时钟
- 大数据——海量数据处理的基本方法总结
- 文件系统上的特殊权限
- android-------采用AIDL调用远程服务