P1012 [NOIP1998 提高组] 拼数

[NOIP1998 提高组] 拼数

题目描述

设有 n 个正整数 a1an,将它们联接成一排,相邻数字首尾相接,组成一个最大的整数。

输入格式

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

第二行有 n 个整数,表示给出的 n 个整数 ai

输出格式

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

样例 #1

样例输入 #1

3
13 312 343

样例输出 #1

34331213

样例 #2

样例输入 #2

4
7 13 4 246

样例输出 #2

7424613

提示

对于全部的测试点,保证 1n201ai109

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 @   DawnTraveler  阅读(163)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示