字串排序 n個數連線得到最小或最大的多位整數

2021-09-08 03:55:14 字數 1168 閱讀 1201

描述:設有n個正整數,將它們依次連成在一排,組成乙個多位數,現在要求可能組成的多位數中最大的多位數是什麼?

例如:n=3時,3個整數13,312,343連成的最大多位數為:343-312-13。

例如:n=4時,4個證書7,13,4,246連成的最大多位數為:7-4-246-13。

輸入:n個整數,eof結尾。

輸出:最大的多位數。

此題很容易想到使用貪心法。

把整數按從大到小的順序連線起來,測試題目的例子也都符合,但最後測試的結果卻不全對。按這種貪心標準,我們很容易找到反例:12,121 應該組成12121而非12112,那麼是不是相互包含的時候就從小到大呢?也不一定,如:12,123 就是12312而非12112,這樣情況就有很多種了。

是不是此題不能用貪心法呢?

其實此題是可以用貪心法來求解,只是剛才的貪心標準不對,正確的貪心標準是:先把整數化成字串,然後再比較a+b和b+a,如果a+b>b+a,就把a排在b的前面,反之則把a排在b的後面。

舉例說明正常的字串比較缺陷!如:a=』321』,b=』32』,按照標準的字串比較規則因為a>b,所以a+b > b+a ,而實際上'32132' < '32321'。 

所以,自定義一種字串的比較規則:

如果a+b>b+a,則我們認為a>b。

且可以證明:如果a+b>=b+a,b+c>=c+b,則一定有:a+c>=c+a。 

這樣一來,程式就很簡單了。分3步:

(1)先把n個數字轉換成字串儲存;

(2)按照自定義的規則把n個字串從大到小排序;

(3)依次輸出這些字串。

1 #include 2 #include 3 #include 

4 #include 5

6using

namespace

std;78

string int2str(int

num)

1314

intmain()

1522

for (unsigned int i = 0; i < v.size()-1; i++) 27}

28}2930

for (unsigned int i = 0; i < v.size(); i++)

33return0;

34 }

貪心演算法 n個數連線得到最小或最大的多位整數

設有n個正整數,將他們連線成一排,組成乙個最大的多位整數。例如 n 3時,3個整數13,312,343,連成的最大整數為 34331213 又如 n 4時,4個整數7,13,4,246連線成的最大整數為7424613 輸入 n n個數輸出 連線成的多位數 演算法分析 此題很容易想到使用貪心法,在考試...

《演算法之美》 n個數連線得到最小的多位整數

題目 設有n個正整數,將它們連線成一排,組成乙個最小的多位整數?例如 n 2時,2個整數32,321連線成的最小整數是 32132 n 4時,4個整數55,31,312,33連線成的最小整數為 312313355。解答 由於題目涉及到整數的連線,如果直接進行整數的連線,可能會超出整數的表示範圍,因此...

《演算法之美》 n個數連線得到最小的多位整數

題目 設有n個正整數,將它們連線成一排,組成乙個最小的多位整數?例如 n 2時,2個整數32,321連線成的最小整數是 32132 n 4時,4個整數55,31,312,33連線成的最小整數為 312313355。解答 由於題目涉及到整數的連線,如果直接進行整數的連線,可能會超出整數的表示範圍,因此...