【题解】Solution Set - NOIP2024集训Day77 反悔贪心
【题解】Solution Set - NOIP2024集训Day77 反悔贪心
https://www.becoder.com.cn/contest/5747
「AGC018C」Coins
在没有 \(x,y,z\) 限制的时候,每个人一定取三个数中最大的那个。出现超出限制的,反悔调整。
打了,但是没调出来:https://www.becoder.com.cn/submission/2698286
https://www.luogu.com.cn/article/cftakc2x
其实,我们可以先钦定所有的人都取第一个数,然后再选 \(y,z\) 个数来调整,这样只剩两个就不用考虑调整的时候目标堆也满了的情况。
「AGC007F」Shik and Copying String
转化一下题意:相当于是每次可以选择若个个连续段让每段都变为这一段的左端点。
https://www.luogu.com.cn/article/5yo6b4jn
(md,之前就是想的这么转化题意的,但是有点没理清楚就没管了。😥
(好的,让我们继续思考。
既然是不能有交,那么每个路径就要尽可能的靠右。
考虑对每个 \(t_i\) 从后往前找它的路径,路径尽可能靠右,那就要尽可能紧贴后一条路径,我们只需要把之前的折线向左下平移一个单位,然后看一下最上面是否需要新折一下,或者有一些折是多余的,用一个栈维护一下当前的路径上的拐点就行了。
注意到如果后一个路线在最后一行拐弯了那么一定会增加一列,由此更新答案。
「CF335F」Buy One, Get One Free
(FAKE
考虑排序后,买最大值送严格次大值,最后一定剩下若干个相同的值。
可以反证,在不考虑剩下的相同值时,这样的策略是不劣的。
现在考虑剩下的这些相同值,她们无非就是直接买,或者被权值更大的送。
调整一下就行了。
bf:https://www.becoder.com.cn/submission/2698378
虽然但是,OJ 数据水的像什么一样,CF 上面光荣的 WA 了。
Hack:
6
10 8 7 7 5 4
问题在于,一开始那个 “买最大值送严格次大值” 的策略是错的……(只有在 \(a_i\) 互不相同的时候是对的,直接推广到有相同的时候就有问题了。
那么我们不妨对每组相同的元素都考虑上述反悔的过程。
https://www.luogu.com.cn/article/uuzg6nwk
当前枚举到 \(a_i\),一共 \(c_i\) 个,考虑拿一个单调队列 \(q\) 维护 \(i\) 以前因为送得到的。
令 \(sum=\sum_{j=1}^{i-1} c_j\)
对于这 \(c_i\) 个 \(a_i\):
-
首先,\(p=\min(sum-2|q|,c_i)\) 个派一定是可以因为之前买了但还没送的那些,来补送的,也就不要钱。直接加入 \(q\);
-
其次,剩下的部分中多余 \(sum-p\) 的部分一定只能掏钱买(因为前面的再多也不够送这些的了。
-
最后,再剩下的 \(\min(c_i-p,sum-p)\) 个 \(a_i\) 就可以掏钱买或者和前面送的那些争宠。
考虑和 \(q\) 里面的元素比较。设 \(x\) 为当前 \(q\) 内的最小值。
-
\(x>a_i\):
现在决策仍不明显,我们考虑在 \(q\) 中加入一个 \(2a_i-x\) 的派。可以发现后面的情况进一步确认了当前的决策。具体的,最终的 \(q\) 中:
- 仅存在 \(2a_i-x\):相当于我们买下 \(x\) 换得两个 \(a_i\);
- 仅存在 \(x\):还是花钱买了两个 \(a_i\);
- 同时存在 \(x,2a_i-x\):不买 \(x\) 但从别处获得了两次送的机会来得到两个 \(a_i\)。
-
\(x<a_i\):(因为存在 \(2a_i-x\) 的虚拟派,所以需要考虑这个
可以发现买下 \(x\) 送两个 \(a_i\) 一定更优,于是删去 \(x\) 将两个 \(a_i\) 加入 \(q\)。
-
注意实现的时候,因为只有严格小于才能送,所以同一个 \(a_i\) 新加入 \(q\) 的元素要先缓存一下,考虑完这 \(c_i\) 个再统一放入 \(q\) 中。