单调栈——数位删减
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;
}
最后祝福
看都看了,给主播一个赞把球球了