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;
}
┆ 凉 ┆ 暖 ┆ 降 ┆ 等 ┆ 幸 ┆ 我 ┆ 我 ┆ 里 ┆ 将 ┆ ┆ 可 ┆ 有 ┆ 谦 ┆ 戮 ┆ 那 ┆ ┆ 大 ┆ ┆ 始 ┆ 然 ┆
┆ 薄 ┆ 一 ┆ 临 ┆ 你 ┆ 的 ┆ 还 ┆ 没 ┆ ┆ 来 ┆ ┆ 是 ┆ 来 ┆ 逊 ┆ 没 ┆ 些 ┆ ┆ 雁 ┆ ┆ 终 ┆ 而 ┆
┆ ┆ 暖 ┆ ┆ 如 ┆ 地 ┆ 站 ┆ 有 ┆ ┆ 也 ┆ ┆ 我 ┆ ┆ 的 ┆ 有 ┆ 精 ┆ ┆ 也 ┆ ┆ 没 ┆ 你 ┆
┆ ┆ 这 ┆ ┆ 试 ┆ 方 ┆ 在 ┆ 逃 ┆ ┆ 会 ┆ ┆ 在 ┆ ┆ 清 ┆ 来 ┆ 准 ┆ ┆ 没 ┆ ┆ 有 ┆ 没 ┆
┆ ┆ 生 ┆ ┆ 探 ┆ ┆ 最 ┆ 避 ┆ ┆ 在 ┆ ┆ 这 ┆ ┆ 晨 ┆ ┆ 的 ┆ ┆ 有 ┆ ┆ 来 ┆ 有 ┆
┆ ┆ 之 ┆ ┆ 般 ┆ ┆ 不 ┆ ┆ ┆ 这 ┆ ┆ 里 ┆ ┆ 没 ┆ ┆ 杀 ┆ ┆ 来 ┆ ┆ ┆ 来 ┆

浙公网安备 33010602011771号