1106 删数问题

1106 删数问题

难度:普及/提高-

题目类型:贪心

提交次数:3

涉及知识:字符串、贪心

题目描述

键盘输入一个高精度的正整数N,去掉其中任意k个数字后剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和k,寻找一种方案使得剩下的数字组成的新数最小。

输出应包括所去掉的数字的位置和组成的新的正整数。(N不超过250位) 输入数据均不需判错。

代码:

#include<iostream>
#include<cstring>
using namespace std;
int main(){
    string s;
    cin>>s;
    int k;
    cin>>k;
    int n = 0;
    int i = 0;
    //cout<<bool(i<=s.length()-2)<<endl;
    while(n<k&&i<s.length()-1){
        i++;
        if(s[i-1]>s[i]){
            s.erase(i-1,1);
            n++;
            i=0;
        }
    }
    //cout<<k-n<<endl;
    for(i = 0; i < k-n; i++) 
        s.erase(s.length()-1, 1);
    for(i = 0; i < s.length(); i++){
        if(s[i]!='0') {
            cout<<s.substr(i, s.length()-i);
            return 0;
        }
    }
    if(i==s.length())cout<<'0';
    return 0;
}

备注:

感觉被诅咒一样,这道题写的特别费劲。基本思路就是贪心,找到降序就删掉第一个,然后再从头找。最开始是i、n应该是1还是0,在什么位置加1,加1还是减1还是不加不减这种小细节搞了半天,感觉智商被掏空。字符串函数用的还是不熟练,多写写就好了。另外要注意的关键就是先导0问题。ps:字符0和数字0不一样,所以不能用if(s[i])判断。另外有一个诡异的问题,就是注释的第一行,由于老师出去约饭去了,正在等待老师解答中。


得到老师解答,很神奇,s.length()的返回值的是无符号数,负数和无符号数比就出问题啦。

原文地址:https://www.cnblogs.com/fangziyuan/p/5781903.html