(贪心)删数问题

题目:

键盘输入一个高精度的正整数n(<=240位),

去掉任意s个数字后剩下的数字按原左右次序将组成一个新的正整数。

编程对给定的n和s,寻找一种方案,使得剩下的数最小。

Simple Input
178543
4
Simple Output
13

删一个数使其剩下的数组成的正整数最小
12345,删五
13245,删三
我们发现,从高位到低位来循环,如果这个数递增,那么就删最后一个,如果这个数有递减区间,就把区间里第一个数删去这样的话会得到最小的正整数。

#include<iostream>
#include<cstring>
using namespace std;
int main(){
    char a[300];
    cin.getline(a,sizeof(a));
    int b,n,i;
    cin>>b;
    n=strlen(a);
    for(i=0;i<n;++i){
        if(a[i]!=-1&&a[i]>a[i+1]) {
            a[i]=-1;//用-1来标记被删掉的数
            b--;
            i=0;    //一次删除,重新循环寻找递减区间
        }
        if(b==0) break;
    }
    if(b!=0){//如果递减数列数量不够,从后面找相应数量删掉
        for(i=n-1;;++i){
            if(a[i]!=-1){
                a[i]=-1;
                b--;
            }
            if(b==0) break;
        }
    }
    for(i=0;i<n;++i){
        if(a[i]!=-1) cout<<a[i];
    } 
} 

猜你喜欢

转载自blog.csdn.net/qq_40828914/article/details/80720502