PAT 甲级 1038 Recover the Smallest Number 两种思路

2024-06-19 16:32

本文主要是介绍PAT 甲级 1038 Recover the Smallest Number 两种思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这道题的大致思路是每次把能够让拼接后的数字最小的串放在前面,怎么来比较哪个放在前面最小呢?考虑下面两种情况
情况1:321 32 324
情况2:131 13 134
显然应该把第一位最小的放在最前面,第一位相同比较第二位,如果所有位都相同呢?比如上面32和13的情况?可以循环进行比较。比如判断321和32谁放在前面的时候,比较3和3,2和2,3和1得到结果321更小,所以321放在前面。这个循环比较方法的思路和证明并不直观。需要考虑到前n位相同的时候,拼接串需要保证小的数字更早出现。

#include <bits/stdc++.h>
using namespace std;
// 按位循环比较(这个可行性不是那么直观)
bool cmp(const string& a, const string& b)
{int sz = std::max(a.size(), b.size());for (int i = 0; i < sz; ++i) {if (a[i % a.size()] != b[i % b.size()]) {return a[i % a.size()] < b[i % b.size()];}}return true;
}
int main()
{
#ifdef LOCALfreopen("input.txt", "r", stdin);
#endifint n; cin >> n;vector<string> nums(n);for (int i = 0; i < n; ++i) {cin >> nums[i];}sort(nums.begin(), nums.end(), cmp);string ans = "";for (auto& i : nums) ans += i;// 去除前导0bool fro_zero = true;for (auto& i : ans) {if (fro_zero && i != '0') {fro_zero = false;}if (!fro_zero) cout << i;}// 如果全是0,输出0if (fro_zero) cout << 0;cout << endl;
}

另外一种思路更加自然:
考虑a和b两个串,a+b和b+a分别表示a拼接在前面和b拼接在前面。如果a+b<b+a,那么要让拼接的结果更小,只要把a放在前面就可以了。从而可以贪心:在判断a和b谁放在前面的时候,每次都把x+y<y+x的x放在前面。

#include <bits/stdc++.h>
using namespace std;
// 拼接之后比较
bool cmp(const string& a, const string& b)
{return a + b < b + a;
}
int main()
{
#ifdef LOCALfreopen("input.txt", "r", stdin);
#endifint n;cin >> n;vector<string> nums(n);for (int i = 0; i < n; ++i) {cin >> nums[i];}sort(nums.begin(), nums.end(), cmp);string ans = "";for (auto& i : nums) ans += i;// 去除前导0bool fro_zero = true;for (auto& i : ans) {if (fro_zero && i != '0') {fro_zero = false;}if (!fro_zero) cout << i;}// 如果全是0,输出0if (fro_zero) cout << 0;cout << endl;
}

这篇关于PAT 甲级 1038 Recover the Smallest Number 两种思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1075547

相关文章

Python安装Pandas库的两种方法

《Python安装Pandas库的两种方法》本文介绍了三种安装PythonPandas库的方法,通过cmd命令行安装并解决版本冲突,手动下载whl文件安装,更换国内镜像源加速下载,最后建议用pipli... 目录方法一:cmd命令行执行pip install pandas方法二:找到pandas下载库,然后

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

SpringBoot服务获取Pod当前IP的两种方案

《SpringBoot服务获取Pod当前IP的两种方案》在Kubernetes集群中,SpringBoot服务获取Pod当前IP的方案主要有两种,通过环境变量注入或通过Java代码动态获取网络接口IP... 目录方案一:通过 Kubernetes Downward API 注入环境变量原理步骤方案二:通过

Go语言中Recover机制的使用

《Go语言中Recover机制的使用》Go语言的recover机制通过defer函数捕获panic,实现异常恢复与程序稳定性,具有一定的参考价值,感兴趣的可以了解一下... 目录引言Recover 的基本概念基本代码示例简单的 Recover 示例嵌套函数中的 Recover项目场景中的应用Web 服务器中

golang实现延迟队列(delay queue)的两种实现

《golang实现延迟队列(delayqueue)的两种实现》本文主要介绍了golang实现延迟队列(delayqueue)的两种实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目录1 延迟队列:邮件提醒、订单自动取消2 实现2.1 simplChina编程e简单版:go自带的time

CentOS7增加Swap空间的两种方法

《CentOS7增加Swap空间的两种方法》当服务器物理内存不足时,增加Swap空间可以作为虚拟内存使用,帮助系统处理内存压力,本文给大家介绍了CentOS7增加Swap空间的两种方法:创建新的Swa... 目录在Centos 7上增加Swap空间的方法方法一:创建新的Swap文件(推荐)方法二:调整Sww

QT6中绘制UI的两种方法详解与示例代码

《QT6中绘制UI的两种方法详解与示例代码》Qt6提供了两种主要的UI绘制技术:​​QML(QtMeta-ObjectLanguage)​​和​​C++Widgets​​,这两种技术各有优势,适用于不... 目录一、QML 技术详解1.1 QML 简介1.2 QML 的核心概念1.3 QML 示例:简单按钮

Python MCPInspector调试思路详解

《PythonMCPInspector调试思路详解》:本文主要介绍PythonMCPInspector调试思路详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋... 目录python-MCPInspector调试1-核心知识点2-思路整理1-核心思路2-核心代码3-参考网址

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及