算法设计与分析——删数问题

来源:互联网 发布:seo学习 编辑:程序博客网 时间:2024/04/29 15:05

-通过键盘输入一个高精度的正整数n(n的有效位数<=240),去掉其中任意s个数字后,剩下的数字按原左右次序将组成一个新的正整数。编程对给定的n和s,寻找一种方案,使得剩下的数字组成的新数最小。
-输入:n,s
-输出:最后剩下的最小数
-输入示例:
178543
4
-输出示例:
13

思路:
使用贪心算法,从左到右依次遍历,找到第一次出现的a(k)>a(k+1)
依次删除所有的使a(k)>a(k+1)的所有的a(k)
但要保证,删除的个数不要超过s个 and 如果没有删到s个,数字就已经单调递增,那么直接跳出循环,取该数字的前n-s位即可。

#include <iostream>#include <string>using namespace std;string min_num(string str,int s){    long len=str.size();    int ss=s;    //int tem=0;    while(s>0){ //最多s轮,保证不会删除多于s个数        bool b=false; //判断此轮有没有删除元素,如果没有 则跳出循环        for(int j=0;j<str.size();j++){ //遍历字符串,找到第一个str[j]<str[j+1]的元素,并且删除str[j]            if(str[j]>str[j+1]){                str.erase(j,1);                b=true; //代表此轮删除元素                break;                //tem++;                //if(tem==s){break;}            }        }        s--;        if(b==false){ //此轮没有删除元素,代表字符串中元素已按递增顺序排列。跳出while循环            break;        }    }    string ans_str = str.erase(len-ss,str.size()-len+ss); //因为存在 没有删够s位数的情况,所以取字符串前n-s个元素,并返回    return ans_str;}int main(int argc, const char * argv[]) {    string str;  //输入的高精度正整数    int s;   //去掉的位数    cin>>str;    cin>>s;    cout<<min_num(str,s)<<endl;   //调用方法}

运行结果:

这里写图片描述

原创粉丝点击