题目
题目详解
两种角度取求解这道题:
- 暴力的角度。
从暴力的角度,那肯定直接就算求排列的问题,把所有的排列给枚举出来取最大的那个,根据此题的问题规模最大为20,故可以采取此方法。求排列可用next_permutation。 - 贪心的角度。
用简单的string数组把所有数组融汇在一起,那么我们如何保证排出来的数字是最大的呢?我们只需调用排序即可,需要自定义排序的规则,一旦两个字符串连在一起时比它们交换位置连在一起的时候要小,则两者字符串位置交换。
解题代码
方法一:next_permutation
#include<bits/stdc++.h>
using namespace std;
string s[25];
int main(){
int n;
cin>>n;
string ret;
for(int i=0;i<n;i++){
cin>>s[i];
ret += s[i];
}
int p[n];//用于构建排列顺序的数组
for(int i=0;i<n;i++)p[i] = i;
while(next_permutation(p, p+n)){
string cmp;
for(int i=0;i<n;i++){
cmp += s[p[i]];
}
ret = max(ret,cmp);
}
cout<<ret;
return 0;
}
方法二:sort
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int n;
string s[100];
cin >> n;
for(int i = 0; i < n; i++) cin >> s[i];
sort(s, s + n, [](auto&a,auto&b){return a+b>b+a;});
for(int i = 0; i < n; i++) cout << s[i];
return 0;
}