【题解】Solution Set - NOIP2024集训Day71 贪心

【题解】Solution Set - NOIP2024集训Day71 贪心

https://www.becoder.com.cn/contest/5712


「BalticOI 2016 Day2」交换

https://www.luogu.com.cn/article/38tenp0y

最开始的分讨是容易想到的。

然后就只考虑了左儿子、右儿子及她们的四个儿子这六个点,来决定是否对左儿子和右儿子再交换一次。

实际情况远远不止。拿到了 6pts 的好成绩

正确的做法是直接看在保证全局字典序最小的情况下,较小的那个儿子在哪边子树中会被分配到更小的编号来决定是否交换。

而这个过程是可以记搜的,过程和一开始的分讨类似。

1h30min(一直以为是哪里细节没处理对……

其实转化为完全二叉树之后就要有意识的去利用她深度是 \(\log\) 的性质。


「CCO 2015」饥饿的狐狸

\(m\gets w\),都按照 \(a_i\)\(m\) 的关系分类。

第一问是 navie 的。

  1. \(a_i=m\):忽略。
  2. \(a_i<m\):先喝一次水,然后 \(a_i\) 从大到小排序,贡献最小为 \(m-\min a_i\)
  3. \(a_i>m\):先喝一次水,然后 \(a_i\) 从小到大排序,贡献最小为 \(\max a_i-m\)

第二问是 has a lat of corner 的。

仍忽略掉 \(a_i=m\)\(a_i\)。现在我们将 \(a_i\) 按跟 \(m\) 大小关系分成两个集合。

接下来,我们先给答案设置一个限制,然后不断放宽限制并贪心调整答案。

另外一个很典的例子是:NOIP2024模拟赛22 T2

首先假设吃所有的饼干前都喝水,其实就是限制答案的贡献都来自 \(a_i\)\(m\) 的配对。

此时答案为 \(\sum|a_i-m|\)


这样肯定是很劣的,然后考虑分属两个集合相邻配对时对答案的贡献。

我们将这样的两个饼干挨在一起的时候,对答案多出来的贡献就是前一个饼干的 \(|a-m|\)

而这样配对的对数一定取决于两个集合的中大小较小的那个。

所以我们对两个集合分别从大到小排序,然后每次取前面的计算贡献,然后一定只剩下一个集合。


然后发现这样仍不是最优的。https://www.becoder.com.cn/submission/2687659

问题在于,同一个集合内也可以产生贡献。比如存在 \(a_x>a_y>m\),我们将 \(y\) 接到 \(x\) 的后面,可能比 \(y\) 接在一次喝水后更优,也即 \(a_x-a_y>a_y-m\)

然后注意到每次选最大的和最小的进行这样的配对一定是不劣的。(因为贡献相同,但更有可能满足上面的不等式。

直接对上一次剩下的集合每次选最大的和最小的匹配就行了。


还有一个问题是,不同集合间的匹配较相同集合间的匹配优先级更高,我们才能按如上顺序来调整。

其实可以发现不同集合间的匹配一定是不劣的,因为她能贡献整个 \(a-m\),而相同集合间的匹配只贡献 \(a-m\) 的一部分。所以我们还是显然更大的去进行不同集合间的匹配,然后剩下的进行相同集合间的匹配。


「NOI2010」超级钢琴

非常典的「前 \(k\) 优」已经属于是。另外一道题是 「CCO 2020」Shopping Plans


「AGC034C」Tests

先一开始钦定所有的 \(a_i\)\(b_i\)。这一定是一组解,然后我们考虑调整。

\(a_i\) 往下调整,\(c_i\) 一定取 \(l_i\);反之,往上调整,\(c_i\) 一定取 \(r_i\)​。

并且,我们注意到一个 \(a_i\) 一定会被调整的极限,也即 \(0\)\(X\),特别的可能存在一个不满足。否则一定不优。

但是还是没有办法确定哪些 \(a_i\) 往上,哪些往下。

答案肯定是可以二分的(但是似乎也可以不用(?


https://www.luogu.com.cn/article/66v21c1a

好吧,二分还是必要的。

答案确定的好处是:上面说的那个结论,我们就可以直接确定出 \(a_i=X\) 的个数,然后取最大的那些就行了。这样就解决了上面说的没法确定哪些 \(a_i\) 往上,哪些往下的痛点了。

直接调整还有一个问题是:我们写出来的式子应该是:

\[f_i(x)=\begin{cases}l_i(x-b_i)&x\in[0,b_i]\cap\mathbb N\\ r_i(x-b_i)&x\in(b_i,X]\cap\mathbb N \end{cases} \]

这样确实很难看出怎么贪心,我们在让一个 \(x\) 变大,让她用尽一个很大的 \(r_i\) 带来的好处的时候,也可能浪费了一个很小的 \(l_i\)​。但是稍微化一步:

\[f_i(x)=\begin{cases}l_ix-l_ib_i&x\in[0,b_i]\cap\mathbb N\\ (r_ix+l_ib_i-r_ib_i)-l_ib_i &x\in(b_i,X]\cap\mathbb N \end{cases} \]

这似乎看上去没什么区别,但是发现后面都是 \(-l_ib_i\),我们把她们都忽略掉。这个时候 \(x=0\)\(f_i(x)=0\)。(切实这就和 Rainbunny 题解里面说的一样了)

也就是说,当 \(x=0\) 也就是一开始说的往下调整的时候,对答案没有贡献了!这样我们直接比较括号内的那部分就可以了。

实际上这样变换的本质是:你 \(x\) 不同取值的时候,贡献方式不一样,这很难决定按那种贡献方式来衡量两个 \(x\) 谁更优,于是我们考虑将某一个贡献方式的贡献,强行转换到另外一种,这样使得贡献方式只有一种。


「ARC147E」Examination

(本来是有想法转化到二分图匹配上的,但是感觉自己的贪心挺对的就没去想。

https://www.luogu.com.cn/article/t92ca2ni

详细解释一下这个霍尔定理,相当于我们是可以让所有的 \(a_i\)\(b_j\le a_i\) 的连边,合不合法就是看存不存在完美匹配。根据霍尔定理,如果我们让 \(a\) 部的子集每次只选其中某一个元素,每个 \(a_i\) 前的 \(b\) 的个数一定比 \(a\) 多,也就是题解中的结论,这是必要的,然后容易发现这是充分的。

这种看似求最优解的题目,实际上也可以去想怎么简便的判断一个答案是否合法。

然后可以考虑二分,或者贪心的去调整答案直到合法。

posted @ 2024-11-07 08:24  CloudWings  阅读(20)  评论(2编辑  收藏  举报