习题8-4 UVA - 11491 Erasing and Winning 奖品的价值(滑动窗口)
2016-05-22 22:14
204 查看
大体题意:
给你一个n 位的整数,让你删除其中d个数字,使得剩下的n-d个数字组成的数尽量大!
问最大是多少?
思路:
因为n最大是100000,所以存数字要用char 数组来存,
然后遍历每一位数字s[i];
在建立一个char ans[maxn] 来存取答案!
int cnt表示ans数组第几个数值,那么n - i 为剩下的还没遍历的数的个数,cnt 表示已经加入的数的个数,n-d 为最终目标数的个数
所以上来先判断能不能删除ans 中数,
当cnt + n - i > n -d时 并且 s[i] > ans[cnt]时才删,删的话--cnt即可!
删除完之后 判断能否向ans 数组中加入数字, 也就是cnt < n -d 的话 ans 就加入数字。
最后输出ans数组即可!
给你一个n 位的整数,让你删除其中d个数字,使得剩下的n-d个数字组成的数尽量大!
问最大是多少?
思路:
因为n最大是100000,所以存数字要用char 数组来存,
然后遍历每一位数字s[i];
在建立一个char ans[maxn] 来存取答案!
int cnt表示ans数组第几个数值,那么n - i 为剩下的还没遍历的数的个数,cnt 表示已经加入的数的个数,n-d 为最终目标数的个数
所以上来先判断能不能删除ans 中数,
当cnt + n - i > n -d时 并且 s[i] > ans[cnt]时才删,删的话--cnt即可!
删除完之后 判断能否向ans 数组中加入数字, 也就是cnt < n -d 的话 ans 就加入数字。
最后输出ans数组即可!
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 100000 + 10; char s[maxn]; char ans[maxn]; int main(){ int n,d; while(scanf("%d%d",&n,&d) == 2 && (n || d)){ getchar(); gets(s); int cnt = 0; for (int i = 0; s[i]; ++i){ while(cnt && cnt + n-i > n-d && ans[cnt] < s[i])--cnt; if (cnt < n-d)ans[++cnt] = s[i]; } ans[cnt+1] = 0; puts(ans+1); } return 0; }
相关文章推荐
- UVA 1339 - Ancient Cipher(题意)(排序)
- Libheap:一款用于分析Glibc堆结构的GDB调试工具
- asp.net MVC Session锁的问题
- Windows10 桌面图标设置
- js 闭包
- LeetCode-141&142.Linked List Cycle
- HTTP长连接与短连接
- 添加了SPF记录后仍然能够冒名发送邮件
- 选择相册照片并且显示(拿到返回的图片地址)
- Java线程池架构(一)原理和源码解析
- nod-1639-绑鞋带
- 选项卡
- mysql使用传输表空间迁移大表测试
- 练习三1014
- JavaScript类和模块
- Stream和Buffer
- java程序使用JDBC接口连接数据库
- Struts 2 的stream result用法
- AutoCompleteTextView和GridView
- 树的遍历-已知中序+(前序|后序)求层次遍历