P1012 [NOIP 1998 提高组] 拼数
题目描述
设有 n n n 个正整数 a 1 … a n a_1 \dots a_n a1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入格式
第一行有一个整数,表示数字个数 n n n。
第二行有 n n n 个整数,表示给出的 n n n 个整数 a i a_i ai。
输出格式
一个正整数,表示最大的整数
输入输出样例 #1
输入 #1
3
13 312 343
输出 #1
34331213
输入输出样例 #2
输入 #2
4
7 13 4 246
输出 #2
7424613
说明/提示
对于全部的测试点,保证 1 ≤ n ≤ 20 1 \leq n \leq 20 1≤n≤20, 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1≤ai≤109。
NOIP1998 提高组 第二题
错误思路
先分享一个错误思路,就是按照字符串直接进行升序排序,这样的话只能得75分
错误案例 ;
6
321 32 407 135 13 217
按照上述思路排序的话 会得到
4073213221713513
但是不如
40732321…
正确思路
按照 s1+s2 > s2+s1 进行排序
如果s1+s2大于s2+s1,那么就位于前列
AC CODE
```#include<bits/stdc++.h>
using namespace std;
const int N = 25;
struct range{
string s;
}r[N];
bool cmp(struct range r1,struct range r2){
return r1.s+r2.s > r2.s + r1.s;
}
int main(){
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int n;
cin >> n;
for(int i=0; i<n; i++)cin >> r[i].s;
sort(r,r+n,cmp);
for(int i=0; i<=n; i++)cout << r[i].s;
return 0;
}