hdu 3183 A Magic Lamp(RMQ)
2016-03-17 14:17
295 查看
题目链接:hdu 3183 A Magic Lamp
题目大意:给定一个字符串,然后最多删除K个。使得剩下的组成的数值最小。
解题思路:问题等价与取N-M个数。每次取的时候保证后面能取的个数足够,而且取的数最小,查询最小的操作用RMQ优化。
题目大意:给定一个字符串,然后最多删除K个。使得剩下的组成的数值最小。
解题思路:问题等价与取N-M个数。每次取的时候保证后面能取的个数足够,而且取的数最小,查询最小的操作用RMQ优化。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 10005; int N, M, d[maxn][20]; char s[maxn]; void rmq_init() { N = strlen(s); for (int i = 0; i < N; i++) d[i][0] = s[i]; for (int k = 1; (1<<k) <= N; k++) { for (int i = 0; i < N; i++) d[i][k] = min(d[i][k-1], d[i+(1<<(k-1))][k-1]); } } int rmq_query(int l, int r) { int k = 0; while ((1<<(k+1)) <= r - l + 1) k++; return min(d[l][k], d[r-(1<<k)+1][k]); } int main () { while (scanf("%s%d", s, &M) == 2) { rmq_init(); M = N - M; int mv = 0; bool flag = true; for (int i = M; i; i--) { int c = rmq_query(mv, N - i); while (mv < N && s[mv] != c) mv++; mv++; if (c == '0' && flag) continue; flag = false; printf("%c", c); } if (flag) printf("0"); printf("\n"); } return 0; }
相关文章推荐
- 迭代器模式
- SQLdeveloper同时显示多个表的窗口
- php安装gearman扩展实现异步分步式任务
- CodeForces - 595B Pasha and Phone (数学技巧)好题
- spring web项目 数据库用户名密码加密解密
- Java中的程序结构
- 测试
- ASP.NET WAB API 2 生命周期管道图
- 3月17日 45道T-SQL查找 习题
- Ninject.MVC 知识点记录
- hdu 4632 Palindrome subsequence 区间dp
- (译)OpenGLES2.0 Iphone开发指引:第二部分,纹理贴图
- MyEclipse生成javadoc时出错:编码GBK的不可映射字符"解决办法
- 整理的php笔记地址
- UIWebView加载网页、文件及html的方法
- Android判断当前线程是主线程的方法
- 抽象类和接口的区别
- 排序算法汇总
- Adapter接口及其实现类
- Android自定义View基础篇(一)