题目:删删越小
题目:
链接:https://ac.nowcoder.com/acm/contest/11471/E来源:牛客网
第一行输入一个数
第二行输入删除几个数
输出删数之后最小的数
1<=len(N)<=2×107
第二行输入一个整数k代表删除几个数字
0<=k<=len(N)
代码
#include<iostream>
#include<algorithm>
#include<cstdio> //用scanf和printf
#include<string.h>//要求字符串的长度
#include<bits/stdc++.h>
using namespace std;
const int N=1e8+10;
char a[N];
int q[N]; //用数组模拟一个栈,比STL快一点,q数组存的是下标
int top=0; //定义栈顶当前为零
int main()
{
int cnt; //表示将要
scanf("%s",a);
cin>>cnt; //输入将要删除的数
int len=strlen(a);
for(int i=0;i<len;i++){
while(cnt>0 && top>0 &&a[q[top]]>a[i]){
cnt--; //删除一次
top--; //出现比栈顶更小的元素出栈
}
q[++top]=i;
}
//如果没删完的话从后面开始删,因为单调栈已经排好序了
while(cnt--){
top--;
}
int flag=1;
for(int i=1;i<=top;i++){
if(a[q[i]]=='0' && flag==1){
flag=1;
}
else{
flag=0;
cout<<a[q[i]];
}
}
if(flag==1)
printf("0");
return 0;
}