1 条题解

  • 0
    @ 2025-8-24 21:16:53

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar chen_zhe
    Aya 敲可爱的~

    搬运于2025-08-24 21:16:52,当前版本为作者最后更新于2024-12-14 15:21:53,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    欢迎报名洛谷网校,期待和大家一起进步!

    本题考查字符串、排序和贪心。

    本题的核心突破口在于小杨要求满足的条件:

    假设 tit_i 为字符串 tt 的第 ii 个字符,对于所有的 j<ij\lt i 均有 tjtit_j\le t_i。两个字符的大小关系与其在字母表中的顺序一致,例如 $\texttt{e}\lt \texttt{g}\lt \texttt{p} \lt \texttt{s}$。

    这个条件要求了最后的字符串 tt,所有字母应当是从小到大排列的,例如说最后的字符串一定是像 aaaabbbccd\tt{aaaabbbccd}(所有字母从小到大排列)的样子,而不是像 aaaabbbdcc\tt{aaaabbbdcc} 的样子。

    因此考虑将读入的每个字符串 s1,s2,,sns_1,s_2,\dots,s_n 从小到大排列,然后拼接在一起组成字符串 tt。在 C++ 语言中,字符串的比较是根据字典序进行排列的,因此相对较小的字符串,例如说 aaaa\tt{aaaa} 会出现在 aabc\tt{aabc} 这个更大的字符串前面。由此,我们就得到了尽可能让小的字母出现在字符串前面,大的字母出现在字符串后面的 tt。随后,我们判断 tt 的所有字母是否是从小到大排列的,即可完成本题。

    参考代码(部分):

    //省略:将 s[i] 从小到大排序
    for (int i = 1; i <= n; i++)
        t += s[i];
    bool flag = true;
    for (int i = 0; i < (int)t.length() - 1; i++) {
        if (t[i] > t[i + 1])
            flag = false;
    }
    
    • 1

    信息

    ID
    11108
    时间
    1000ms
    内存
    512MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者