zoukankan      html  css  js  c++  java
  • Codeforces 1530E Minimax 题解

    一道很好的构造题,锻炼思维。

    以下设原串长为 (len)

    Case 1: 只有一种字符

    直接输出原串即可。

    Case 2: 有多种字符

    Case 2.1: 存在一种字符出现次数为1

    显然把这个字符放在最前面,其他字符排序后接在后面即可。

    如:( exttt{bbcaaa}) 最优解为 ( exttt{caaabb})

    Case 2.2: 所有字符出现次数大于等于2

    不妨设最小的字符为 ( exttt{a}) ,其出现次数为 (cnt)

    那么,最后的答案为 (1)

    由于要保证字典序最小,我们尽可能多地把 ( exttt{a}) 放在最前。不难发现最前面最多有有连续两个 ( exttt{a})

    Case 2.2.1 最前面可以放连续两个a

    考虑除这两个 ( exttt{a}) 以外的 ( exttt{a}) ,由于这些 ( exttt{a}) 不能连续出现,所以这些 ( exttt{a}) 每个后要么接一个非 ( exttt{a}) 的字符,要么放在字符串尾。所以,字符串最前面可以放连续两个 ( exttt{a}) ,当且仅当 (cnt-1 le len-cnt+1) (注意:从前往后第二个 ( exttt{a}) 后也要接非 ( exttt{a}) 的字符)。

    可行性知道了,那还要构造最优解。显然,我们把所有非 ( exttt{a}) 的字符排序,在相邻两个字符间依次插入 ( exttt{a}) 直至 ( exttt{a}) 用完。如果 ( exttt{a}) 没有用完则一定还剩 (1)( exttt{a}) ,放在串最后即可。

    例:( exttt{baaaaaabcc}) 最优解为 ( exttt{aababacaca})

    Case 2.2.2 最前面不能放连续两个a

    那么,最前面只能放一个 ( exttt{a})

    在其之后一定会接第二小的字符,不妨设为 ( exttt{b})

    那么,后面不能再出现形如 ( exttt{ab}) 这样的串了。

    若字符种类 (le 2),所有的 ( exttt{a}) 应放在所有的 ( exttt{b}) 之后(否则一定会出现形如 ( exttt{ab}) 这样的串)。如 ( exttt{bbabaaaaa}) 的最优解为 ( exttt{abbbaaaaa})

    否则,我们可以在最前面的 ( exttt{b}) 后接所有的 ( exttt{a}) ,再接一个第三小的字符(不妨设为 ( exttt{c}) ),然后剩下的字符放置的位置没有限制,直接从小到大排序即可。如 ( exttt{bbaaaaaaaaaccdd}) 的最优解为 ( exttt{abaaaaaaaacbcdd})

    Code

  • 相关阅读:
    树莓派AI视觉云台——8、WiringPi库函数
    树莓派AI视觉云台——7、树莓派系统备份
    树莓派AI视觉云台——7、树莓派系统备份
    树莓派AI视觉云台——6、Linux常用命令及vim编辑器的使用
    树莓派AI视觉云台——6、Linux常用命令及vim编辑器的使用
    树莓派AI视觉云台——5.SSH文件传输
    暑假第一周进度报告
    teamfinal使用体验(15号作品)
    《驱动学习
    《驱动学习
  • 原文地址:https://www.cnblogs.com/acceptedzhs/p/15028594.html
Copyright © 2011-2022 走看看