貪心之刪數問題

Problem Description

 鍵盤輸入一個高精度的正整數n(≤100位),去掉其中任意s個數字後剩下的數字按照原來的左右次序組成一個新的正整數。編程對給定的n與s,尋找一種方案,使得剩下的數字組成的新數最小。

Input

  輸入有多組 每組包括原始數n,要去掉的數字數s;

Output

 輸出去掉s個數後最小的數

Sample Input

178543  4

Sample Output

13

題解:

使用貪心,刪去遞增區間末位或遞減區間首位,取得局部最優解,同時注意處理0爲前置時的情況

例如1002 2 結果爲0 而不是00

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
using namespace std;

int main()
{
    char a[110];
    int s;
    while(cin>>a>>s){
        int len=strlen(a);
        if(s>=len) {
            cout<<"0"<<endl;
            continue;
        }
        //n次循環,刪去遞增區間末位或遞減區間首位,實現區部貪心
        while(s--){
            int j=0;
            while(j<len&&a[j]<=a[j+1]){
                j++;
            }
            //進行前移
            len--;
            for(int i=j;i<len;i++){
                a[i]=a[i+1];
            }
        }
        //處理前置字符爲0
        int i=0;
        while(a[i]=='0'&&i<len){
            i++;
        }

        if(i==len) cout<<"0"<<endl;
        else {
            for(int k=i;k<len;k++){
                cout<<a[k];
            }
            cout<<endl;
        }

    }
    return 0;
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章