csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:拼数

csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:拼数

题目描述

设有 n n n 个正整数 a 1 ... a n a_1 \dots a_n a1...an,请将它们连接成一排,相邻数字首尾相接,组成一个最大的整数。

输入格式

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

第二行有 n n n 个整数,表示给出的 n n n 个整数 a i a_i ai。

输出格式

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

输入输出样例 1
输入 1
复制代码
3
13 312 343
输出 1
复制代码
34331213
输入输出样例 2
输入 2
复制代码
4
7 13 4 246
输出 2
复制代码
7424613
说明/提示

对于全部的测试点,保证 1 ≤ n ≤ 20 1 \leq n \leq 20 1≤n≤20, 1 ≤ a i ≤ 10 9 1 \leq a_i \leq 10^9 1≤ai≤109。

思路分析

本题要求将若干个正整数拼接成一个最大的整数。不能直接按数值大小排序,因为需要考虑拼接后的字典序。例如 989"9"+"89" = "989" 大于 "89"+"9" = "899",所以 9 应排在 89 前面。

正确做法:将所有数字转换为字符串,然后按照 a + b > b + a 的规则进行降序排序,最后依次拼接输出。此比较规则能保证任意两个字符串的拼接顺序最优,且满足传递性,因此排序后整体结果最大。

代码实现

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

// 比较函数:若 a+b > b+a 则 a 排在 b 前面
bool cmp(string a, string b) {
    return a + b > b + a;
}

int main() {
    int n;
    cin >> n;
    vector<string> v(n);
    for (int i = 0; i < n; ++i) {
        cin >> v[i];  // 读入整数,作为字符串存储
    }
    sort(v.begin(), v.end(), cmp); // 按自定义规则排序
    for (string s : v) {
        cout << s; // 拼接输出
    }
    return 0;
}

功能分析

  • 输入处理 :读取整数个数 nn 个正整数,存储为字符串向量。
  • 排序规则 :自定义比较函数 cmp,判断 a+bb+a 的字典序大小,确保排序后拼接结果最大。
  • 输出结果:按排序后的顺序依次输出字符串,得到最大整数。
  • 正确性 :该贪心策略等价于求字符串连接后的最大字典序,已证明具有最优子结构和传递性,适用于本题数据范围(n ≤ 20, a i ≤ 10 9 a_i ≤ 10^9 ai≤109)。

各种学习资料,助力大家一站式学习和提升!!!

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"##########  一站式掌握信奥赛知识!  ##########";
	cout<<"#############  冲刺信奥赛拿奖!  #############";
	cout<<"######  课程购买后永久学习,不受限制!   ######";
	return 0;
}

【秘籍汇总】(完整csp信奥赛C++学习资料):

1、csp/信奥赛C++,完整信奥赛系列课程(永久学习):

https://edu.csdn.net/lecturer/7901 点击跳转

2、CSP信奥赛C++竞赛拿奖视频课:

https://edu.csdn.net/course/detail/40437 点击跳转

https://edu.csdn.net/course/detail/41081 点击跳转

3、csp信奥赛高频考点知识详解及案例实践:

CSP信奥赛C++动态规划:
https://blog.csdn.net/weixin_66461496/category_13096895.html点击跳转

CSP信奥赛C++标准模板库STL:
https://blog.csdn.net/weixin_66461496/category_13108077.html 点击跳转

信奥赛C++提高组csp-s知识详解及案例实践:
https://blog.csdn.net/weixin_66461496/category_13113932.html 点击跳转

4、csp信奥赛冲刺一等奖有效刷题题解:

CSP信奥赛C++初赛及复赛高频考点真题解析(持续更新): https://blog.csdn.net/weixin_66461496/category_12808781.html 点击跳转

信奥赛C++提高组csp-s初赛&复赛真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13125089.html 点击跳转

5、GESP C++考级真题题解:

GESP(C++ 一级+二级+三级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12858102.html 点击跳转

GESP(C++ 四级+五级+六级)真题题解(持续更新):https://blog.csdn.net/weixin_66461496/category_12869848.html 点击跳转

GESP(C++ 七级+八级)真题题解(持续更新):
https://blog.csdn.net/weixin_66461496/category_13117178.html 点击跳转

· 文末祝福 ·

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int main(){
	cout<<"跟着王老师一起学习信奥赛C++";
	cout<<"    成就更好的自己!       ";
	cout<<"  csp信奥赛一等奖属于你!   ";
	return 0;
}
相关推荐
王老师青少年编程1 天前
csp信奥赛C++高频考点专项训练之贪心算法 --【排序贪心】:魔法
c++·算法·贪心·csp·信奥赛·排序贪心·魔法
wearegogog1231 天前
基于和差波束法的单脉冲测角MATLAB实现
人工智能·算法·matlab
AI科技星1 天前
灵魂商数(SQ) · 全域数学统一定义【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
晓觉儿1 天前
【GPLT】2026年第十一届团队程序设计天梯赛赛后题解(已写2h,存档中)
数据结构·c++·算法·深度优先·图论
We་ct1 天前
LeetCode 322. 零钱兑换:动态规划入门实战
前端·算法·leetcode·typescript·动态规划
6Hzlia1 天前
【Hot 100 刷题计划】 LeetCode 394. 字符串解码 | C++ 单栈回压法
c++·算法·leetcode
穿条秋裤到处跑1 天前
每日一道leetcode(2026.04.22):距离字典两次编辑以内的单词
算法·leetcode
淘矿人1 天前
Claude辅助算法设计与优化
人工智能·python·算法·microsoft·github·bug·pygame
流年如夢1 天前
自定义类型进阶:联合与枚举
java·c语言·开发语言·数据结构·数据库·c++·算法
wayz111 天前
Day 10:集成学习进阶(Boosting: AdaBoost, GBDT)
算法·机器学习·集成学习·boosting