1. 程式人生 > >刪數問題(典型的貪心演算法問題)

刪數問題(典型的貪心演算法問題)

題目:

鍵盤輸入一個高精度的正整數n(<=240位),

去掉任意s個數字後剩下的數字按原左右次序將組成一個新的正整數。

程式設計對給定的n和s,尋找一種方案,使得剩下的數最小。

Simple Input
178543
4
Simple Output

13

先放程式碼:

#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
    int s,len;
    char n[260];
    bool flag=false;
    gets(n);
    len=strlen(n);
    scanf("%d",&s);
    for(int i=1;i<=s;++i)
    {
        for(int j=0;j<len-1;j++)
            if(n[j]>n[j+1])
            {
                for(int k=j;k<len-1;++k)
                n[k]=n[k+1];
                break;
            }
        len--;
    }
    for(int i=0;i<=len-1;++i)
    {
        if(n[i]!='0') flag=true;
        if(flag) printf("%c",n[i]);
    }
}


相信讀者會有以下疑問:

我們發現刪數時的規律為:若是升序,則刪除升序的最後一個,若是降序,則刪除第一個,那為什麼我寫了降序而不寫升序?

原因如下:
1、若是升序,當n[j]<n[j+1]時你不能保證n[j+1]是這個升序列裡的最後一個,而降序卻能判斷

2、刪降序的貪心效果比升序好,因為越高位越小越好