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

相关文章

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

在C#中调用Python代码的两种实现方式

《在C#中调用Python代码的两种实现方式》:本文主要介绍在C#中调用Python代码的两种实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#调用python代码的方式1. 使用 Python.NET2. 使用外部进程调用 Python 脚本总结C#调

IDEA中Git版本回退的两种实现方案

《IDEA中Git版本回退的两种实现方案》作为开发者,代码版本回退是日常高频操作,IntelliJIDEA集成了强大的Git工具链,但面对reset和revert两种核心回退方案,许多开发者仍存在选择... 目录一、版本回退前置知识二、Reset方案:整体改写历史1、IDEA图形化操作(推荐)1.1、查看提

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Redis解决缓存击穿问题的两种方法

《Redis解决缓存击穿问题的两种方法》缓存击穿问题也叫热点Key问题,就是⼀个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击,本文给大家介绍了Re... 目录引言解决办法互斥锁(强一致,性能差)逻辑过期(高可用,性能优)设计逻辑过期时间引言缓存击穿:给

VSCode中C/C++编码乱码问题的两种解决方法

《VSCode中C/C++编码乱码问题的两种解决方法》在中国地区,Windows系统中的cmd和PowerShell默认编码是GBK,但VSCode默认使用UTF-8编码,这种编码不一致会导致在VSC... 目录问题方法一:通过 Code Runner 插件调整编码配置步骤方法二:在 PowerShell

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.

C++实现回文串判断的两种高效方法

《C++实现回文串判断的两种高效方法》文章介绍了两种判断回文串的方法:解法一通过创建新字符串来处理,解法二在原字符串上直接筛选判断,两种方法都使用了双指针法,文中通过代码示例讲解的非常详细,需要的朋友... 目录一、问题描述示例二、解法一:将字母数字连接到新的 string思路代码实现代码解释复杂度分析三、

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

linux进程D状态的解决思路分享

《linux进程D状态的解决思路分享》在Linux系统中,进程在内核模式下等待I/O完成时会进入不间断睡眠状态(D状态),这种状态下,进程无法通过普通方式被杀死,本文通过实验模拟了这种状态,并分析了如... 目录1. 问题描述2. 问题分析3. 实验模拟3.1 使用losetup创建一个卷作为pv的磁盘3.