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

2021-07-09 06:54:49 字數 1674 閱讀 5410

設有n個正整數,將他們連線成一排,組成乙個最大的多位整數。例如:n=3時,3個整數13,312,343,連成的最大整數為:34331213

又如:n=4時,4個整數7,13,4,246連線成的最大整數為7424613

輸入:n

n個數輸出:連線成的多位數

演算法分析:此題很容易想到使用貪心法,在考試時有很多同學把整數按從大到小的順序連線起來,測試題目的例子也都符合,但最後測試的結果卻不全對。按這種貪心標準,我們很容易找到反例: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步,先把n個數字轉換成字串儲存;再按照自定義的規則把n個字串排序;最後按照從小到大的順序輸出這些字串(如果從大到小則是求最大的多位整數)。

我的**:

#include 

#include 

#include 

#include 

using namespace std; 

string converttostring(int num) 

int main() 

string a,b; 

vector::iterator it=vec.begin(); 

a=converttostring(*it); 

for (it=vec.begin()+1;it!=vec.end();it++) 

cout<    cout<    return 0; 

}來自網上的一段**:

#include 

#include 

#include 

class number 

bool operator <(const number&target)const 

; const char*getstr()const; 

private: 

std::string str; 

}; typedef std::set numbers; 

void test(number*target,int len) 

int main() 

; number all=; 

number all1=; 

number all2=;

number all4=;

#define test(t)  test((t),sizeof(t)/sizeof(number)) 

test(all3); 

test(all); 

test(all1); 

test(all2); 

test(all4); 

system("pause"); 

return 0; }

《演算法之美》 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。解答 由於題目涉及到整數的連線,如果直接進行整數的連線,可能會超出整數的表示範圍,因此...

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

描述 設有n個正整數,將它們依次連成在一排,組成乙個多位數,現在要求可能組成的多位數中最大的多位數是什麼?例如 n 3時,3個整數13,312,343連成的最大多位數為 343 312 13。例如 n 4時,4個證書7,13,4,246連成的最大多位數為 7 4 246 13。輸入 n個整數,eof...