zoukankan      html  css  js  c++  java
  • 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()的返回值的是无符号数,负数和无符号数比就出问题啦。

  • 相关阅读:
    weblogic中server的启动
    oracle connect by
    DBA常用的一些视图和sql
    查询分类并实现分类统计SQL存储过程
    从一组数据中寻找第K大的数
    一个关于StringBuilder延伸类
    总结.net的技术特性
    C#Reflection学习记录
    Asp.net 安全补丁发布
    比较无聊的while与for的较量。
  • 原文地址:https://www.cnblogs.com/fangziyuan/p/5781903.html
Copyright © 2011-2022 走看看