单调栈——数位删减

OK啊这题我做了3个小时——被小bug整爆了

先看题目:

3.  数位删减

题目ID:9789拓展题100分

100 分

时间限制: 1000ms

空间限制: 524288kB

题目描述

题目描述

给出一个数字 x,你需要删去其中 k 位,要求结果为不包含前导零的正整数。问结果最小是多少。

输入格式

第一行一个整数 T 代表数据组数。

每组数据第一行一个整数代表 x,第二行一个整数代表 k。

输出格式

每组数据输出一行,代表答案。

样例输入

5 10000 4 1337 0 987654321 6 66837494128 5 7808652 3

样例输出

1 1337 321 344128 7052

数据规模

1≤T≤1051≤T≤105,1≤x≤105×1051≤x≤105×105,0≤k≤∣x∣0≤k≤∣x∣,∑∣x∣≤5×105∑∣x∣≤5×105。

主要这题比较简单(虽然是绿题

所以,直接开始讲思路

这题我用的是单调栈的解法,还有别的方法,这里不过多介绍

首先

我们肯定要维护我们栈顶最大,其次,我们必须找到第一个减小的值,

举个例子:8 9 6 5 4 2,我们要先找到 6这个数字

然后就简单了,一个一个把数字入栈,再一个一个判断数字和栈顶的大小关系,最后把我们处理好的数组输出即可

代码实现

#include <bits/stdc++.h>
#define int long long
using namespace std;
int T;
int k;
string s;
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>T;
	while(T--)
	{
		cin>>s>>k;
        int le = s.length();
        if(le <= k)
        {
            cout<<0<<endl;
            continue;
        }
        int idx = 0;
        int cn = 10;
        
        for(int i = 0;i <= min(k,le-1);i++)
	    {
	    	if(s[i] != '0' && s[i] - '0' < cn)
            {
                cn = s[i] - '0';
                idx = i;
            }
	    }
        k -= idx;
        cout<<s[idx] - '0';
        int tt = 0;
        int st[le + 10] = {0};
        for(int i = idx + 1;i < le;i++)
        {
            while(tt > 0 && k > 0 && (s[i] - '0' < st[tt]))
            {
                tt--,k--;
            }
            st[++tt] = s[i]-'0';
        }
        for(int i = 1;i <= tt - k;i++)
        {
            cout<<st[i];
        }
        cout<<endl;
	}
	return 0;
}

最后祝福

    看都看了,给主播一个赞把球球了

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值