当前位置: 首页 > news >正文

洛谷P1012

题目描述

给定 \(n\) 个正整数 \(a_1 \dots a_n\),将它们连接成一个最大的数。

分析

  1. 先取其中两个数字 \(a\)\(b\),例如 \(12\)\(121\)
  2. 有两种合并的结果,分别是 \(a+b\)\(b+a\),即 \(12121\)\(12112\)
  3. 取较大的 \(a+b\) \((12121)\) 为拼接结果。
    猜测:由于拼接后的长度是一定的,当 \(n=2\) 时,只需要比较 \(a+b\)\(b+a\) 然后取较大的那个就行了。能不能把这种思想扩展到 \(n>2\) 的情况呢?
    观察:
  • 如果 \(a\) 应该排在 \(b\) 前面(\(a+b > b+a\)),
  • 如果 \(b\) 应该排在 \(c\) 前面( \(b+c > c+b\)),
  • 那么 \(a\) 一定排在 \(c\) 前面(\(a+c > c+a\))!
  • 最终的顺序将是 \(a+b+c\)
    结论:这个比较规则满足传递性,考虑直接对它们排序。

Solution

标签:贪心

直接对这些数字字符串排序即可,排序规则如下:

(string x, string y) { 
return x + y > y + x; 
}

时间复杂度

总时间复杂度:\(O(n \log n \cdot L)\)

  • 排序需要 \(O(n \log n)\) 次比较。
  • 每次比较 \(O(L)\)\(L\) 是字符串平均长度)。
  • 由于 \(n \leq 20\)\(L \leq 10\)\(a_i \leq 10^9\)),可以接受。

参考代码

#include <bits/stdc++.h>
using namespace std;
string s[21];
int n;
int main() {cin >> n;for (int i = 1; i <= n; i++)cin >> s[i];sort(s + 1, s + 1 + n, [](string x, string y) { return x + y > y + x; });for (int i = 1; i <= n; i++)cout << s[i];return 0;
}
http://www.jsqmd.com/news/359216/

相关文章:

  • 线性规划的经典应用:从数学模型到企业决策实战
  • 洛谷P5435
  • 一键配置RK3588网络与SSH远程连接
  • 细胞多尺度仿真软件:PhysiCell_(2).PhysiCell软件介绍及安装
  • W11电脑无法获取到Windows服务器DHCP的IP地址,如何解决?
  • 新手入门指南:一文看懂环境搭建、模型配置与 WebUI 远程访问
  • ABC_444
  • 低代码处理物联网大数据:Node-RED进阶教程
  • 大数据领域 Hadoop 高可用方案的设计与实现
  • 细胞多尺度仿真软件:MCell_(14).并行计算与大规模仿真
  • 细胞多尺度仿真软件:MCell_(11).MCell在生物医学研究中的应用实例
  • php python+vue网上汽车销售系统的开发
  • 大数据可视化中的用户行为分析展示
  • 深入解析:【无线电控制与数据链探测系统】第2章 无线电与数据链基础
  • 细胞多尺度仿真软件:MCell_(10).仿真结果的分析与可视化
  • 从零开始用自定义 Triton 内核编写 FlashAttention-2
  • ApiScan
  • 神经网络模型基础与简单实现
  • Hadoop vs Spark:哪种大数据框架更适合物联网数据处理?
  • 线性代数资源合集(第二辑)
  • LOJ6485
  • 大数据领域数据清洗的实用工具推荐
  • 别再拍脑袋上线了:用大数据把 A/B 测试和在线实验平台这件事干“正经”
  • 口腔医学教程资源合集
  • php python+vue网上同学录系统_开题报告
  • 提示工程架构师必知:Agentic AI的3大设计模式
  • 基于springboot的运动服服装销售系统
  • javascript数组之循环
  • 例说FPGA:可直接用于工程项目的第一手经验【3.5】
  • AI与提示架构整合的评估方法论:提示工程架构师的指标体系