给定 n 个正整数,将它们首尾相接,求能组成的最大整数。
定义字符串集合 S 上的二元关系 ≻:
x≻y⟺xy>yx
其中 xy 表示字符串 x 和 y 的拼接。
设 v(s) 为字符串 s 对应的数值,l(s) 为 s 的长度。构造映射 φ:S→R:
φ(s)=10l(s)−1v(s)
x≻y⟺v(x)10l(y)+v(y)>v(y)10l(x)+v(x)⟺v(x)(10l(y)−1)>v(y)(10l(x)−1)⟺10l(x)−1v(x)>10l(y)−1v(y)⟺φ(x)>φ(y)
由实数域上 > 的传递性和非对称性,可知 ≻ 在 S 上满足 严格弱序。
假设最优排列 P 存在相邻逆序 pi+1≻pi,交换两者得到 P′。
由于 pi+1pi>pipi+1,且交换不影响前后缀的数值贡献。故 P′ 总数值严格增大,与 P 为最优解矛盾。
因此,最优解为按 ≻ 降序的排列。
时间复杂度为 O(nlogn)。
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin>>n;
vector<string> a(n);
for(auto &s:a)cin>>s;
sort(a.begin(),a.end(),[](auto x,auto y){return x+y>y+x;});
for(auto s:a)cout<<s;
return 0;
}