题解:AT_past202012_d リーディングゼロ

· · 题解

AT_past202012_d リーディングゼロ 题解

atcoder 传送门
洛谷传送门

题目大意

给定 N 个字符串 S_i,这些字符串仅由数字组成。请将它们视为十进制数,并按照数值小的顺序进行排序。对于相同数值的字符串,前导零更多的字符串应排在前面。

题目思路

就是字符串排序,详情看代码吧,注释很清楚。

Code

#include <bits/stdc++.h> // 引入所有标准库
using namespace std;

int n; // 存储输入的字符串数量
string s[100010]; // 用于存储字符串的数组,最大长度为100010

// 自定义比较函数,用于字符串排序
bool cmp(string a, string b) {
    int alen = a.size(), blen = b.size(); // 获取两个字符串的长度
    int maxx = max(alen, blen); // 确定二者长度中的最大值

    // 将较短的字符串前面补零,使其与较长的字符串长度一致
    for (int i = 0; i < maxx - alen; i++) a = '0' + a; // 为字符串 a 前面补零
    for (int i = 0; i < maxx - blen; i++) b = '0' + b; // 为字符串 b 前面补零

    // 比较补零后的字符串,如果不同则按字典序比较,如果相同则按长度比较
    return a != b ? a < b : alen < blen; 
}

int main() {
    cin >> n; // 输入字符串的数量
    for (int i = 1; i <= n; i++) cin >> s[i]; // 输入每个字符串

    // 对字符串数组进行排序,使用自定义比较函数 cmp
    sort(s + 1, s + n + 1, cmp); 

    // 输出排序后的字符串
    for (int i = 1; i <= n; i++) cout << s[i] << '\n'; 

    return 0; // 程序结束
}