題目
描述
設有n個正整數(n≤20),將它們聯接成一排,組成一個最大的多位整數。
例如:n=3時,3個整數13,312,343聯接成的最大整數爲:34331213
又如:n=4時,4個整數7,13,4,246聯接成的最大整數爲:7424613
輸入
第一行,一個正整數n。
第二行,n個正整數。
輸出
一個正整數,表示最大的整數
輸入樣例
3
13 312 343
輸出樣例
34331213
解題思路
(注:以下“a+b”形式表示a字符串後接上b字符串所得字符串)
如果直接暴搜,複雜度高達 ,即使加了剪枝也無濟於事。
那麼這道題多半是以一種特定的方式排序後輸出。
怎麼排序呢?
我們把數字看成字符串,考慮構成一個字符串中的任意兩個子字符串a和b,若a+b < b+a,那麼顯然我們把b放在a的前面更優。舉個例子,100+10 < 10+100,所以10100比10010更優(這個例子也可以排除直接比較a和b的大小的做法)。因此,我們就以此爲排序依據,排序後一次輸出即可。
Code
用C++的string是真的方便!
#include<cstdio>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int n;
string s[25];
bool cmp(string a, string b){
return a + b > b + a;
}
int main(){
scanf("%d", &n);
for(int i = 1; i <= n; i++) cin >> s[i];
sort(s+1, s+n+1, cmp);
for(int i = 1; i <= n; i++) cout << s[i];
return 0;
}