解题思路
我们想让剩下的数越小越好,且前面的数能最小最好。
则维护一个单调上升的序列,遇到一个比栈顶小的数就弹出栈顶,即删除它,然后直到栈顶小于当前数。
注意删掉的数量不能大于k,还有最后输出不能有前导零。(如果删完了或最后只剩一个零就单输出一个)
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
int ok,n,k,t,a[10010],st[10010];
int main(){
scanf("%d",&n);
cin>>s;
for(int i=0;i<s.size();i++)
a[i+1]=s[i]-48;
scanf("%d",&k);
for(int i=1;i<=n;i++)
{
while(a[i]<a[st[t]]&&t>0)
{
a[st[t]]=-1;
t--,k--;
if(k==0)
break;
}
if(k==0)
break;
st[++t]=i;
}
while(k>0&&t>0)
{
a[st[t]]=-1;
t--,k--;
}
for(int i=1;i<=n;i++)
{
if(a[i]==-1)
continue;
if(a[i]!=0)
ok=1;
if(ok||a[i]!=0)printf("%d",a[i]);
}
if(ok==0)printf("0");
}