一、题目描述
题目描述
设有 nn 个正整数 a1…ana1…an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。
输入格式
第一行有一个整数,表示数字个数 nn。
第二行有 nn 个整数,表示给出的 nn 个整数 aiai。
输出格式
一个正整数,表示最大的整数
输入输出样例
输入 #1复制
3 13 312 343输出 #1复制
34331213输入 #2复制
4 7 13 4 246输出 #2复制
7424613说明/提示
对于全部的测试点,保证 1≤n≤201≤n≤20,1≤ai≤1091≤ai≤109。
NOIP1998 提高组 第二题
二、分析
由于这道题目的要求是将n个数首尾相接 ,所以我们为了尽可能地结果更大,我们不能直接判断这个数字地大小 而应该从第一位开始比较 如果第一位相等则应该比较下一位,例如我们现在要将30和123与21进行拼接 直接比较肯定是123>21 但是3012321<3021123 .
三、代码部分
- 首先,定义一个比较函数来比较两个数字字符串连接后的大小
bool compare(const string& num1, const string& num2) {
string str1 = num1 + num2;
string str2 = num2 + num1;
return str1 > str2;
}
- 读取输入的数字个数
n
和各个数字。
int n;
cin >> n;
vector<string> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
- 使用自定义的比较函数对数字字符串进行排序。
sort(nums.begin(), nums.end(), compare);
- 依次连接排序后的数字字符串,得到最终的结果。
string result;
for (const string& num : nums) {
result += num;
}
cout << result << endl;
例如,如果输入的数字是 13
和 312
,在比较函数中,连接得到 13312
和 31213
,由于 31213
大于 13312
,所以在排序时 312
会排在 13
前面。
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
bool compare(const string& num1, const string& num2) {
string str1 = num1 + num2;
string str2 = num2 + num1;
return str1 > str2;
}
int main() {
int n;
cin >> n;
vector<std::string> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
sort(nums.begin(), nums.end(), compare);
string result;
for (const string& num : nums) {
result += num;
}
cout << result << endl;
return 0;
}