Loading

[每日 C] MEX Game 1

前言

泻药, 吉司机线段树学不动

冷静的利用时间已经变成了不冷静的浪费时间, 干脆打两道 \(\rm{C}\) 冷静一下

思路

看到 \(\rm{MEX}\) 了, 无敌 , 看到 \(2, 1, 0\) 了, 无敌

但是应该不是这个方向

先转化题意

\(\textrm{Alice, Bob}\) 轮流进行游戏, \(\textrm{Alice}\) 每次取出数组中的一个数放进结果数组中, \(\textrm{Bob}\) 每次删除数组中的一个数, \(\textrm{Alice}\) 希望最大化 \(\rm{MEX}\) , 而 \(\textrm{Bob}\) 希望最小化, 求最终的游戏得分

好的也是抄了一遍题

首先玩一下样例, 你发现 \(\rm{Alice}\) 应当从小到大取数, 而 \(\rm{Bob}\) 也应当这样取来干扰 \(\rm{Alice}\) , 特别的是一种数只取一次

但是你发现显然这样是错的
给出一组 \(\rm{hack}\)

0 0 1 1 2

\(\mathcal{O} (n)\) 做法

按照我们的方法, \(\rm{Alice}\) 将会取到 \(0, 1\) , 最终答案为 \(2\)
但是你发现如果 \(\rm{Alice}\) 开局直接取 \(2\) , 后面也一定能取到 \(0, 1\) 答案更优

我们考虑形式化表示, 如果一个数出现次数 \(\geq 2\) 那么一定是取得到的, 我们最初还可以取一个出现次数为 \(1\) 的, 贪心的取最小的那个肯定是最优的

\(\mathcal{O} (n \log n)\) 做法

你发现能否取到是由单调性的, 考虑二分

那么如何判定是否能取到一个数?
\(\mathcal{O} (n)\) 算法的思想一样, 出现了超过一个 \(x\) 使得其出现次数小于 \(2\) 即为不合法

总结

一种博弈问题, 即你取一个, 我取一个, 一定可以通过对称取法取到个数 \(\geq 2\) 的数

然后就是对先手的处理

posted @ 2025-01-18 16:11  Yorg  阅读(15)  评论(0)    收藏  举报