HDU 3183 Magic Lamp(单调栈)
题目大意
给一串数字要求删除几个数字之后输出最少的数字。
解题思路
很明显假如前一位比后一位大的话,删除前一位结果更优,如果剩下的是个不下降序列还能删的话就从后往前删,用单调栈就能很简单的解决。
代码
const int maxn = 1e6+10;
const int maxm = 2e2+10;
char str[maxn]; int k;
stack<char> sk; string s;
int main() {
IOS;
while(cin >> str >> k) {
int len = strlen(str);
if(len==k) {
cout << "0" << endl; continue;
}
for (int i = 0; str[i]; ++i) {
while(k && !sk.empty() && sk.top()>str[i]) --k, sk.pop();
sk.push(str[i]);
}
while(k--) sk.pop();
while(!sk.empty()) s += sk.top(), sk.pop();
while(s.size()!=1 && s.back()=='0') s.pop_back();
reverse(s.begin(), s.end());
cout << s << endl; s.clear();
}
return 0;
}