关键在于思维,逐步读入这个数,每次读入一位之后,如果之前已经删除的数字的位数没有达到D,并且已经存储了之前输入的部分的数字,那么就将当前输入的数字和之前存储的数字进行比较,并且逐步删除那些比当前的数字小的数字,这一轮操作结束之后,就判断当前已经插入的数字是否已经到了上限(也就是N-D),如果没有到达上限,那么就将当前的数字插入,最后循环结束,输出最终的结果即可,具体实现见如下代码:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
#include<functional>
using namespace std;
const int maxn = 100000 + 10;
char data[maxn];
int main(){
int N, D;
while (cin >> N >> D){
if (N == 0 && D == 0) break;
int ind = 0;
for (int i = 0; i < N; i++){
char t;
cin >> t;
while (ind > 0 && i - ind < D&&data[ind] < t)
ind--;
if (ind + D < N) data[++ind] = t;
}
for (int i = 1; i <= N - D; i++)
cout << data[i];
cout << endl;
}
return 0;
}