2017搜狐校招——保留最大的数

传送门

Description

给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。 

输入为两行内容,第一行是正整数number,1 ≤ length(number) ≤ 50000。第二行是希望去掉的数字数量cnt 1 ≤ cnt < length(number)。

输出保留下来的结果。

思路

题解:贪心的从头开始往后面查找前一个数比后一个数小的相邻两数,删除前面的数,当所有这种情况都删除,数字数量cnt还不为0,从后面删除剩余cnt个数的数。

(如果选择删除全部0,再删除全部1,再删除全部2的方法,这种贪心策略是错误的。例如:3450  1,正确结果应该为350)

 
#include<bits/stdc++.h>
using namespace std;
const int maxn = 50005;
char s[maxn];
int stk[maxn];

int main(){
    int cnt,top = -1;
    scanf("%s %d",s,&cnt);
    int len = strlen(s);
    for (int i = 0;i < len - 1;i++){
        if (s[i] >= s[i + 1] || !cnt){
            stk[++top] = s[i] - '0';
        }else if (cnt && s[i] < s[i + 1]){
            cnt--;
            while (cnt && top >= 0 && stk[top] < s[i + 1] - '0'){
                top--;
                cnt--;
            }
        }
    }
    stk[++top] = s[len - 1] - '0';
    while (cnt){
        cnt--;
        top--;
    }
    for (int i = 0;i <= top;i++){
        printf("%d",stk[i]);
    }
    printf("\n");
    return 0;
}

  

posted @ 2018-03-30 00:56  zxzhang  阅读(300)  评论(0)    收藏  举报