arc138C 题解

  • 挺喜欢这道题,可惜大号已经红了,又不想要估值,只能用小号交。

  • 题意:A 先手玩游戏。有 n 个数 a1an,A 每次可以任意取一个数,B 每次会取没有被取的数中下标最小的一数。保证 n 为偶数。最大化 A 拿到的数字和。A 可以选择一个数字 k[0,n),把第 1 至第 k 个数依次提到数组的最后面。

  • k 与最大化数字和。

  • 首先我们猜测,最大的 n/2 个数字可以被一起选走。

  • 利用那个大一点的样例一试,还真可以!

  • 那么,如何构造这样的 k 呢?

  • 数字大小已经不重要了,按照它们是否是最大的 n/2 个数,我们把它们替换为 0/1

  • A 不能让 B 取到 1。如果第 i 步时失败了,说明前 2i 个数中 1 的个数超过 0 的个数。

  • 不妨把条件放宽点,我们尝试让前缀的任意 i 个数 1 的个数不多于 0 的个数。

  • 看到不多余与前缀,就想到 Catalan,就想到折线图。

  • 上折线图,1 表示往上走一步,0 表示往下走一步。则折线图不能走到 0 之上。

  • 只要从折线图的最高点出发,就一定不会走到 0 之上。因为起点终点的高度都是 0,前面任意数放到最后面时高度都是原有高度,所以不会超过原折线图最高点。

  • img

  • 上面是 6 个数的一个例子(忽略标号混乱)(cnblogs 图床,看不到请移步 cnblogs

  • 该图对应数组 [1,0,1,1,0,0]

  • 注意到 A5 是最高点,所以应当让新数组从 A5 开始,为 [0,0,1,0,1,1]

  • code

作者:purplevine

出处:https://www.cnblogs.com/purplevine/p/16826126.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   purplevine  阅读(23)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
more_horiz
keyboard_arrow_up dark_mode palette
选择主题
点击右上角即可分享
微信分享提示