描述:設有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 #include4 #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。解答 由於題目涉及到整數的連線,如果直接進行整數的連線,可能會超出整數的表示範圍,因此...