P1012 [NOIP1998 提高组] 拼数

[NOIP1998 提高组] 拼数

题目描述

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

输入格式

第一行有一个整数,表示数字个数 \(n\)

第二行有 \(n\) 个整数,表示给出的 \(n\) 个整数 \(a_i\)

输出格式

一个正整数,表示最大的整数

样例 #1

样例输入 #1

3
13 312 343

样例输出 #1

34331213

样例 #2

样例输入 #2

4
7 13 4 246

样例输出 #2

7424613

提示

对于全部的测试点,保证 \(1 \leq n \leq 20\)\(1 \leq a_i \leq 10^9\)

NOIP1998 提高组 第二题

2.题解

2.1 sort函数

思路

使用字典序排列,考虑到存在34,346,341这种前缀相同,但 34634 > 34346, 34134 < 34341,由较短的首位和较长的前缀的后一位的大小决定谁前谁后

代码

#include<bits/stdc++.h>
using namespace std;
bool cmp(string str1, string str2){
	auto it1 = str1.begin();
	auto it2 = str2.begin(); 
	while(it1 != str1.end() && it2 != str2.end()){
		if(*it1 > *it2) return true;
		else if(*it1 < *it2) return false;
		it1++; it2++;
	}
	if(str1.length() == str2.length()) return true;
	else if(it1 == str1.end()){
		it1 = str1.begin();
		if(*it1 < *it2) return false;
		else return true;
	}
	else if(it2 == str2.end()){
		it2 = str2.begin();
		if(*it1 < *it2) return false;
		else return true;
	}
}
int main(){
	int n;
	cin >> n;
	vector<string> arr(n);
	for(int i = 0; i < n; i++){
		cin >> arr[i];
	}
	sort(arr.begin(), arr.end(), cmp);
	string ans = "";
	for(int i = 0; i < n; i++){
		ans += arr[i];
	}
	cout << ans;
}

2.2 简化

思路

return str1 + str2 > str2 + str1; 一步解决

代码

#include<bits/stdc++.h>
using namespace std;
bool cmp(string str1, string str2){
  return str1 + str2 > str2 + str1;
}
int main(){
	int n;
	cin >> n;
	vector<string> arr(n);
	for(int i = 0; i < n; i++){
		cin >> arr[i];
	}
	sort(arr.begin(), arr.end(), cmp);
	string ans = "";
	for(int i = 0; i < n; i++){
		ans += arr[i];
	}
	cout << ans;
}
posted @ 2024-02-14 21:15  DawnTraveler  阅读(152)  评论(0编辑  收藏  举报