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

题解:[NOIP 1998 提高组] 拼数

题目传送门

题意分析

容易发现,\(n\) 个数 \(a_1,a_2,a_3,\cdots,a_n\) 首尾相接,无论如何排列,最终得到的数 \(x\)位数是一定的。

那么当 \(x\) 的位数一定时,决定 \(x\) 的大小的便是 \(a_1,a_2,\cdots,a_n\) 的排列顺序。贪心的思路便是字典序尽可能地大。正确性是显然的。

注意不是越大的 \(a_i\) 就越前。例如 \(a=\langle13,2\rangle\),取 \(132\) 是不优的。

因此可以写一个比较函数 cmp ,从最高位开始逐位比较两数该位大小,相同则比较下一位,否则该位较大的在前。

但是注意到数据范围比较小,因此有一种简便写法。利用 string 存储 \(a_i\),比较 ab 时:

  • a+b>b+a,则 a 在前。(a 在前会更大)
  • 否则 b 在前。

有了比较函数,排一遍序即可。因为 \(n\leq20\),什么排序都可以猴子排序除外。

AC 代码

//#include<bits/stdc++.h>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cstdio>
#include<string>
#include<vector>
#include<cmath>
#include<ctime>
#include<deque>
#include<queue>
#include<stack>
#include<list>
using namespace std;
int n;
string a[21]; 
bool cmp(string a,string b){return a+b>b+a;
}
int main(){/*freopen("test.in","r",stdin);freopen("test.out","w",stdout);*/cin>>n;for(int i=1;i<=n;i++)cin>>a[i];sort(a+1,a+n+1,cmp);for(int i=1;i<=n;i++)cout<<a[i];/*fclose(stdin);fclose(stdout);*/return 0;
}
http://www.sczhlp.com/news/8246/

相关文章:

  • 基于深度学习的验证码识别系统实现
  • 【pwn做题记录】铁人三项(第五赛区)_2018_rop 1
  • 基于深度学习的验证码自动识别系统实现与优化
  • 第二十五篇
  • 循环神经网络的从零开始实现(RNN)
  • pygame小游戏飞机大战_4发射子弹
  • Spring Boot部门管理系统:查询、删除、新增实战 - 详解
  • 模拟退火大法
  • DAY11 函数对象 函数的嵌套 名称空间和作用域 作用域修改关键字
  • Python入门学习(九)Python的高级语法与用法(一)枚举
  • 进程间通信
  • GAS_Aura-Aura Player Controller
  • LP-BT100蓝牙耳机
  • OpenTelemetry概述
  • cocos2dx项目中遇到的spine问题
  • LGP11364 [NOIP 2024] 树上查询 学习笔记
  • 严格WQS二分
  • 2025 暑期 mx 集训 7.21
  • 8月8号
  • GPT-5 API 请求参数调整,避坑指南(汇总)
  • 题解:CF2048F Kevin and Math Class
  • gem5流程学习-1
  • SPI详细讲解+W25Q128验证
  • 【自学嵌入式:stm32单片机】蜂鸣器
  • 带 PVC 的 Pod 提交后时序事件
  • C#自学笔记:匿名函数与Lambda表达式
  • 如何高效率使用 Cursor ?
  • 注意力头
  • 8月8日
  • 一键上云不是梦!Apache Dubbo 发布微服务集群部署与全新控制台