用单调栈维护一个答案序列。
把比 s [ i ] s[i] s[i]大的栈顶都删掉。
最后栈里的 n − k n-k n−k个就是答案。
注意删去前导0
// Problem: P1106 删数问题
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1106
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// Date: 2021-05-10 23:23:11
// --------by Herio--------
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int N=255,M=2e4+5,inf=0x3f3f3f3f,mod=1e9+7;
#define mst(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
#define fi first
#define se second
#define pb emplace_back
#define SZ(a) (int)a.size()
#define IOS ios::sync_with_stdio(false),cin.tie(0)
void Print(int *a,int n){
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
}
char ans[N];
int main(){
string s;int k;IOS;cin>>s>>k;
int n=SZ(s);
stack<char>st;
st.push(s[0]);
int c=0;
for(int i=1;i<n;i++){
while(!st.empty()&&st.top()>s[i]&&c<k){
st.pop();
c++;
}
st.push(s[i]);
}
while(c<k){
st.pop();
c++;
}
c=n-k;
ans[c--]='\0';
while(c>=0) ans[c--]=st.top(),st.pop();
c=0;while(c<n-k-1&&ans[c]=='0') c++;
printf("%s",ans+c);
return 0;
}