[NOIp1998 T2] 拼數(字符串,排序)

題目

描述

設有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字符串所得字符串)

如果直接暴搜,複雜度高達O(n!) ,即使加了剪枝也無濟於事。
那麼這道題多半是以一種特定的方式排序後輸出。
怎麼排序呢?
我們把數字看成字符串,考慮構成一個字符串中的任意兩個子字符串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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章