洛谷P1012 拼數 【題解】

**原題連接**

題目描述

設有n個正整數(n ≤ 20),將它們聯接成一排,組成一個最大的多位整數。
例如:n=3時,3個整數13,312,343聯接成的最大整數爲:34331213
又如:n=4時,4個整數7,13,4,246聯接成的最大整數爲:7424613ios

輸入描述:

第一行,一個正整數n。
第二行,n個正整數。

輸出描述:

一個正整數,表示最大的整數

分析:

要用一組正整數組成一個最大的多位整數,很天然的想到給這組正整數c++

按字典序排序,而後按字典序從大到小把這組正整數鏈接起來。數組

但,咱們來看這麼一組數據:30 300函數

它們能夠組成:spa

3030030030code

兩個數字。排序

顯然:ci

\[\begin{cases} 30300>30030 \\ X(300)>X(30) \end{cases} \]

其中X(n)爲表示字典序大小的函數。get

這和咱們直覺上的大字典序在前,後連接小字典序所組合多位整數更大的判斷不一樣。string

因此,咱們不能直接比較兩個數字典序就的大小,而是要比較兩個數先後放置組成的數是否比較大。

即:

\[F(x)=max\left\{A+B,B+A\right\} \]

其中,F(x)爲兩正整數組合後的數值大小,AB爲正整數。

代碼

#include<iostream>
#include<string>
#include<algorithm> 
using namespace std;
string a[40];
bool cmp(const string &a,const string &b){
	return a+b<b+a;
}
int main(){
	int n;
	cin>>n;
	for(int i=0;i<n;i++)cin>>a[i];
	sort(a,a+n,cmp);
	string s;
	for(int i=n-1;~i;i--)s+=a[i];
	cout<<s<<endl;
	return 0;
}
相關文章
相關標籤/搜索