键盘输入一个高精度的正整数n(

一、题目分析

很经典的一个题目。采用贪心策略。

这个题目其实可以分成两个小题。

1),使剩下的数最小。

2),使剩下的正整数最小。这时,删除的数字数s 就不能等于 n。以及删除后等于0或0...0就不行了。


1, 使剩下的数最小。

思路:依次遍历正整数的各位数字,将单调递减区间的第一个数字删掉,如果整个字符串已经单调递增排列的话,将最后一个删除.

代码(OJ上没有找到这道题,所以仅测试了自己想到的测试用例):

#include 
using namespace std;
int main() {
    int k;
    string s;
    while (cin >> s >> k) {
        if (k > s.size()) {
            cout << "Invalid Input.";
            continue;
        }
        while (k) {
            int i;
            for (i = 0; i < s.size() - 1 && s[i] <= s[i + 1]; i++);
            s.erase(i, 1);
            k--;

        }
        if (s.empty()) {
            cout << 0 << endl;
            continue;
        }

        int i = 0;
        for (i = 0; i < s.size()-1;) {
            if (s[i] == '0') i++;
            else break;
        }
        cout << s.substr(i) << endl;
    }
}

 
  

2,使剩下的正整数最小。

比如输入100100,删除2位。如果删除1 1,则剩下0000,为数字。而数字0不是正整数,不符合要求。
此时,删除2位后还是正整数的有:
0100
1000
1001
0010
最小的正整数为0010.
而这个时候处理的想法(若有错,望指出)是:从右往左找到第一个不为0的数字,替换掉0...0中一个0,得到新的正整数。
如果这个数字在个位,那么新的正整数就是这个个位数。
如果这个数字在个位以外,新的正整数会比以这个数字向右组成的数小10倍。
具体做法如下:
如100100,从右向左找到1在百位上,那么新的正整数为10.
代码:
#include 
using namespace std;
int main() {
    int k;
    string s;
    while (cin >> s >> k) {
        if(k >= s.size()) {cout << "Invalid Input.";continue;}
        string tmp = s;
        while(k) {
            int i;
            for(i = 0; i < s.size()-1 && s[i] <= s[i+1]; i++);
            s.erase(i, 1);
            k--;

        }

        bool flag = false;
        for(auto &item : s) {
            if (item != '0') {flag = true;break;}
        }

        if(!flag) {
            string ans = "";
            int i = tmp.size()-1, cnt = 0;
            while(tmp[i] == '0') {i--; cnt++;}
            ans += tmp[i];
            for(i = 1; i < cnt; i++) ans += '0';
            cout << ans << endl;
        } else {
            int i = 0;
            for(i = 0; i < s.size();) {
                if(s[i] == '0') i++;
                else break;
            }
            cout << s.substr(i) << endl;
        }

    }
    return 0;
}



你可能感兴趣的:(贪心,Online,Judge,HDU)