1 条题解

  • 0
    @ 2004-4-26 6:21:16

    练85.3 删数问题(Noip1994)

    解题思路

    维护单调不降数字栈。读新数字c时,只要可删且栈顶>c就弹出栈顶并减删除次数,再压入c。全部读完若仍需删,就从末尾删;最后去掉前导0。

    正确性说明

    最小数字优先让高位尽量小,若相邻保留候选前大后小,删除前者能严格减小更高位;栈反复完成这种有益删除。若剩余单调不降,删末尾最不影响较小高位。

    易错点

    保留原左右顺序;若全删或只剩0,输出0。

    复杂度

    位数D,时间O(D),空间O(D)。

    参考代码(C++11)

    #include <bits/stdc++.h>
    using namespace std;
    
    int main() {
        ios::sync_with_stdio(false);
        cin.tie(nullptr);
        string n;
        int s;
        cin >> n >> s;
        string st;
        for (char c : n) {
            while (s > 0 && !st.empty() && st.back() > c) {
                st.pop_back();
                s--;
            }
            st += c;
        }
        while (s > 0 && !st.empty()) {
            st.pop_back();
            s--;
        }
        size_t p = st.find_first_not_of('0');
        cout << (p == string::npos ? "0" : st.substr(p)) << "\n";
        return 0;
    }
    
    • 1

    信息

    ID
    531
    时间
    1000ms
    内存
    128MiB
    难度
    普及−
    标签
    递交数
    0
    已通过
    0
    上传者