题目连接
题意:
题意:不能改变数字序列的顺序,从n个数中删除m个,输出删除后最小的数
数据范围:
(m<n<=1000)输出忽略前导0;
思路:
用一个栈,然后然后如果栈顶元素大于s [ i ] 就弹出栈顶元素(删除该数),一直循环,如果s [ i ] 小于栈顶元素或者栈为空,压入栈,这样我们的栈到最后维护了一个单调递增的序列,然后如果元素没有删够,就删最后几位并输出,并去除该序列的前导0
AC代码:
#include <iostream>
#include<cstring>
#include<stack>
using namespace std;
int main () {
string s = "";
int n;
string ss = "";
while(cin >> s){
cin >> n;
int len = s.length();
int cnt = 0;
stack<int> st;
for(int i = 0; i < len; ++i) {
while (!st.empty() && cnt < n && st.top() > s[i] - '0') { //栈不空
st.pop();
cnt ++;
}
st.push(s[i] - '0');
}
while(!st.empty()){
char ch = st.top()+'0';
ss += ch;
st.pop();
}
int flag = 1;
int lens = ss.length() - (len - n);
for(int i = ss.length() - 1; i >= lens; i--){
if (ss[i] == '0' && flag != 0) continue;
flag = 0;
cout << ss[i];
if(i == lens) {
cout << endl;
}
}
if(flag) {
cout << 0 << endl;
}
}
return 0;
}
/*
110001 1
1101010 2
*/