字符串排序 [NOIP 1998 提高组] 拼数 (C++)

P1012 [NOIP 1998 提高组] 拼数

题目描述

设有 n n n 个正整数 a 1 … a n a_1 \dots a_n a1an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

输入格式

第一行有一个整数,表示数字个数 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 1n20 1 ≤ a i ≤ 1 0 9 1 \leq a_i \leq 10^9 1ai109

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值