最大的数

最大的数_第1张图片

本人的结题思路是从遍历数组,从左到右依次选择区间大小为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
#include

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
#include

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,否则将数字压栈,继续遍历。

你可能感兴趣的:(c++,最大的数)