分析
大的数字尽量靠后,但是高位位权高,所以正着枚举。
所以只要某个数前面有比他大的都尽量去掉(高位优先),并记录个数。维护一个单调递增的栈。
如果都单调递增了k还没用完,那么从后往前删够数。
注意去前导0!
记录的时候是倒着的,所以倒着输出
上代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<stack>
using namespace std;
int n,k,a[10010],ans[10010],tot;
char c[10010];
stack<int> st;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>c[i];
a[i]=c[i]-48;
}
cin>>k;
for(int i=1;i<=n;i++)
{
while(!st.empty()&&a[i]<a[st.top()]&&k>0)
{
st.pop();
k--;
}
st.push(i);
}
while(k>0&&!st.empty())
{
st.pop();
k--;
}
while(!st.empty())
{
if(a[st.top()]>=0) ans[++tot]=a[st.top()];
st.pop();
}
//for(int i=1;i<=tot;i++)cout<<ans[i]<<' ';
int i=tot;
while(ans[i]==0&&i>1) i--;
for(int j=i;j>=1;j--)
{
cout<<ans[j];
}
return 0;
}