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;
}
原文地址:https://www.cnblogs.com/shuitiangong/p/13573162.html