P1012 [NOIP1998 提高组] 拼数
[NOIP1998 提高组] 拼数
题目描述
设有
输入格式
第一行有一个整数,表示数字个数
第二行有
输出格式
一个正整数,表示最大的整数
样例 #1
样例输入 #1
3
13 312 343
样例输出 #1
34331213
样例 #2
样例输入 #2
4
7 13 4 246
样例输出 #2
7424613
提示
对于全部的测试点,保证
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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了