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

P1012 [NOIP 1998 提高组] 拼数

前言

这道题的题号于我比较有意义,于是就来写了。

思路

如果暴力枚举所有排列,时间复杂度为 \(O ( n ! )\),显然不能通过本题。

考虑贪心的做法,特别地,若 \(1 \leq a_i \leq 9\),直接从大到小排序即是最优。但对于 \(\forall a_i \in [1,10^9]\),如果还是采用同样的策略,我们很容易举出反例:\(a_1 = 4 , a_2 = 15\), 组合成 \(154\),显然是不如 \(415\)。正解应当从高到低逐位考虑,比较到相同位置上的数更大的 \(a_i\) 排序在前,拼接起来就是最优解。

形式化地,对于最优解中的每一对相邻数字 \(A,B\),都有 \(A + B \geq B + A\),其中 \(A + B\) 表示 \(A,B\) 两个字符串的拼接。也就是说,对于最优解中 \(\forall i < j\),都有 \(a_i \geq a_j\)。正确性也很好证明,假设在最优解中,存在相邻的两个数字 \(A\)\(B\) 满足 \(A + B < B + A\)。那么交换 \(A\)\(B\) 的位置,新的拼接结果会更大,这与"最优解"矛盾。

代码实现这里给出几种自定义 sort 比较函数的方法。

Code

传入自定义函数指针:

#include<iostream>
#include<algorithm>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N=21;
int n;
string num[N];
bool cmp(string x,string y)
{return x+y>y+x;
}
int main()
{IOS;cin>>n;for(int i=1;i<=n;i++)cin>>num[i];sort(num+1,num+n+1,cmp);for(int i=1;i<=n;i++)cout<<num[i];return 0;
}

传入包含仿函数的对象:

#include<iostream>
#include<algorithm>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N=21;
int n;
string num[N];
class cmp
{public:bool operator()(string x,string y){return x+y>y+x;}
};
int main()
{IOS;cin>>n;for(int i=1;i<=n;i++)cin>>num[i];sort(num+1,num+n+1,cmp());for(int i=1;i<=n;i++)cout<<num[i];return 0;
}

重载 < 运算符:

#include<iostream>
#include<algorithm>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N=21;
int n;
string num[N];
namespace std
{bool operator<(const string &x,const string &y){return (x+y).compare(y+x)>0;}
}
int main()
{IOS;cin>>n;for(int i=1;i<=n;i++)cin>>num[i];sort(num+1,num+n+1);for(int i=1;i<=n;i++)cout<<num[i];return 0;
}

使用 Lambda 运算符:

#include<iostream>
#include<algorithm>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
const int N=21;
int n;
string num[N];
int main()
{IOS;cin>>n;for(int i=1;i<=n;i++)cin>>num[i];sort(num+1,num+n+1,[](const string &x,const string &y){return x+y>y+x;});for(int i=1;i<=n;i++)cout<<num[i];return 0;
}

祝安好。

http://www.jsqmd.com/news/39223/

相关文章:

  • 同步/异步和阻塞/非阻塞学习笔记
  • python 单词搜索(回溯-矩阵-字符串-中等)含源码(二十) - 指南
  • PHP生成RSA密钥对及RSA签名验证类库
  • 2025年杭州维修手机培训公司权威推荐榜单:手机维修教程/手机屏幕维修/维修手机源头公司精选
  • 2025年A2级防火抗倍特板批发厂家权威推荐榜单:高压耐火墙面装饰板/手HPL防火板/隧道防火装饰板源头厂家精选
  • 在基于FastAPI的Python开发框架后端,增加阿里云短信和邮件发送通知处理
  • 11月13日打卡
  • Comparative linguistics
  • 2025-11-11 PQ v.Next日志记录
  • ANT天线ESD防护
  • MATLAB离群点检测与删除
  • 2025短视频拍摄公司排名与推荐:3个核心标准帮你选对团队,避开无效投入
  • C#标签批量打印程序开发
  • 助力企业构建 AI 原生应用,函数计算 FunctionAI 重塑模型服务与 Agent 全栈生态
  • 小迪安全v2023学习笔记(一百三十四讲)—— Windows权限提升篇数据库篇MySQLMSSQLOracle自动化方案
  • vue2 混同,封装公共方法 - 东方不败-
  • 2025年PP多功能废气净化塔生产厂家权威推荐榜单:聚丙烯多功能废气净化塔/PPH多功能废气净化塔/PPH尾气吸收塔源头厂家精选
  • 2025年新疆初三复读班权威推荐榜单:中考复读快速提分/初三补习班/初三集训班源头服务商精选
  • source insight4菜单工具按钮变乱恢复
  • 2025 国产 ITSM 厂商选型全攻略:基础流程、智能赋能与全链路协同深度解析
  • 2025年新疆高三复读班权威推荐榜单:高三复读全日制/高三复读班/清北复读班学校精选
  • 2025年WMS仓库管理系统行业观察:智能仓储新格局加速成型
  • 2025 WMS仓库管理系统推荐排名
  • 深入解析:Linux Cgroup与Device Whitelist详解
  • 合并、拼接一个文件夹及其所有子文件夹中的代码文件(删除空行;软著源代码)
  • 2025年新疆初三复读班权威推荐榜单:初三补习班/初三集训班/本地中考复读学校精选
  • 基于隐语SecretFlow——TrustFlow的数据要素跨域管控
  • 数字无线电 带通调制 / 载波 概念
  • H3C/华三配置远程登录(SSH、Telnet)
  • 2025年三一集团战略深度解析:全球化、数智化与低碳化路径权威推荐