首页 > 代码库 > hdu 3183 A Magic Lamp(RMQ)
hdu 3183 A Magic Lamp(RMQ)
题目链接:hdu 3183 A Magic Lamp
题目大意:给定一个字符串,然后最多删除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;
}
hdu 3183 A Magic Lamp(RMQ)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。