题目
> Sample Input 4 2 3759 6 3 123123 7 4 1000000 0 0
> Sample Output 79 32300
思路
类比单调栈,输入时将元素一个个插到数组末尾,由于位越高的数越大越好,每次进栈的时候做类似单调栈操作,就是一直保持数组降序单调性,同时每删去一个数耗一点d。
最后就有两种情况:
- 点数用完:后面直接进数组
- 都进了数组了却没用完点数:从后往前删(因为前面的都是挑过的够大的)
代码
#include <cstdio>
#include <cstdlib>
const int maxn = 100000 + 1000;
char num[maxn];
int n, d, A[maxn];
int main() {
while (scanf("%d%d\n", &n, &d) == 2 && n) {
int p = 0; // p为队列末,开区间
scanf("%s", num);
for (int i = 0; i < n; i++) {
while (d > 0 && p > 0 && A[p-1] < (num[i]-'0')) { p--; d--; }
A[p++] = (num[i] - '0');
}
while (d > 0) { d--; p--; }
for (int i = 0; i < p; i++)
printf("%d", A[i]);
printf("\n");
}
return 0;
}
废话
1.做水题AC真的好开心啊。。
2.第一次感觉自己的解比正解都简单,更开心啦