保留最大的数
时间限制:1秒 空间限制:32768K 热度指数:37781
题目描述
给定一个十进制的正整数number,选择从里面去掉一部分数字,希望保留下来的数字组成的正整数最大。
输入描述:
输入为两行内容,第一行是正整数number,1 ≤ length(number) ≤ 50000。第二行是希望去掉的数字数量cnt 1 ≤ cnt < length(number)。
输出描述:
输出保留下来的结果。
示例1
输入
325 1
输出
35
解题思路:
从左到右找比后面小的数,找到后就跳过这个数,例如87784201(第一次会跳过第二个7),如没找到,stu就记录下来。如果全部相等或者从左到右递减,或者中间也可能有相等情况,
这时stu位置记录的数字是尾部最小的,例如:k = 1
9876543210(stu不记录最后一个0)
55555555555(stu不记录最后一个5)
999888877777666555(stu记录最后一个5)
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
char str[50010], stu[50010];
int main()
{
int k, len, top, count;
while (~scanf("%s%d", str, &k))
{
top = count = 0;
len = strlen(str);
for (int i = 0; i < len; i++)
{
while (top > 0 && count < k && stu[top - 1] < str[i]) /*跳过那些比右边小的数*/
{
count++; /*记录跳过多少数*/
top--; /*覆盖上次比右边小的数*/
}
stu[top++] = str[i]; /*存入满足条件的数*/
}
top = min(top, len - k); /*没有跳够用尾部来补*/
stu[top] = '\0';
printf("%s\n", stu);
}
return 0;
}