[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;
}
标签:arr,return,拼数,str2,str1,P1012,NOIP1998,it2,it1
From: https://www.cnblogs.com/trmbh12/p/18015623