本人的结题思路是从遍历数组,从左到右依次选择区间大小为cnt+1中最大的数,同时删去前面m个数,下次选择区间length+1-m中最大的数,直至所选择的区间不大于0,如输入样例 23334325,3首先取前3+1个数(即2333)中最大的数,3,删去2,再取3+1-1个数(即334)的最大数,即4,删去33,此时选择区间为0,把剩下后面的数字保留,这种方法需要注意的是结束条件的判断,如输入样例10,1,如果没加结束判断,按以上的思路依旧为10。
没加结束判断程序:
#include<stdio.h>
#include<string.h>
const int MAXN = 500000 + 20;
char source[MAXN], des[MAXN];
int main() {
int num;
scanf("%s%d", source,&num);
int top = 0;
int k = 0;
des[top] = source[0];
int len = strlen(source);
for (int i = 0; i < len; i = i + k + 1) {
k = 0;
if (num > 0) {
for (int j = 0; j < num + 1 && i+j < len; j++) {
if (des[top] < source[i + j]) {
des[top] = source[i + j];
k = j;
}
}
num -= k;
}
else {
des[top] = source[i];
}
top++;
}
des[top] = '\0';
printf("%s", des);
return 0;
}
正确程序:
#include<stdio.h>
#include<string.h>
const int MAXN = 500000 + 20;
char source[MAXN], des[MAXN];
int main() {
int num;
scanf("%s%d", source,&num);
int top = 0;
int k = 0;
des[top] = source[0];
int len = strlen(source);
int temp = len - num - 1;
for (int i = 0; i < len; i = i + k + 1) {
k = 0;
if (num > 0) {
for (int j = 0; j < num + 1 && i+j < len; j++) {
if (des[top] < source[i + j]) {
if (top > temp) break;
des[top] = source[i + j];
k = j;
}
}
num -= k;
}
else {
des[top] = source[i];
}
top++;
}
des[top] = '\0';
printf("%s", des);
return 0;
}
另外本人查看了别人的思路,发现更好的做法是通过栈来实现,思路为遍历数字,比较数字与栈顶的大小,栈顶小则不断退栈,直至退栈个数等于cnt,否则将数字压栈,继续遍历。