保留最大的数

时间限制: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;
}