【题解】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\)

  1. 首先,\(p=\min(sum-2|q|,c_i)\) 个派一定是可以因为之前买了但还没送的那些,来补送的,也就不要钱。直接加入 \(q\)

  2. 其次,剩下的部分中多余 \(sum-p\) 的部分一定只能掏钱买(因为前面的再多也不够送这些的了。

  3. 最后,再剩下的 \(\min(c_i-p,sum-p)\)\(a_i\) 就可以掏钱买或者和前面送的那些争宠。

    考虑和 \(q\) 里面的元素比较。设 \(x\) 为当前 \(q\) 内的最小值。

    1. \(x>a_i\)

      现在决策仍不明显,我们考虑在 \(q\) 中加入一个 \(2a_i-x\) 的派。可以发现后面的情况进一步确认了当前的决策。具体的,最终的 \(q\) 中:

      1. 仅存在 \(2a_i-x\):相当于我们买下 \(x\) 换得两个 \(a_i\)
      2. 仅存在 \(x\):还是花钱买了两个 \(a_i\)
      3. 同时存在 \(x,2a_i-x\):不买 \(x\) 但从别处获得了两次送的机会来得到两个 \(a_i\)
    2. \(x<a_i\):(因为存在 \(2a_i-x\) 的虚拟派,所以需要考虑这个

      可以发现买下 \(x\) 送两个 \(a_i\) 一定更优,于是删去 \(x\) 将两个 \(a_i\) 加入 \(q\)

注意实现的时候,因为只有严格小于才能送,所以同一个 \(a_i\) 新加入 \(q\) 的元素要先缓存一下,考虑完这 \(c_i\) 个再统一放入 \(q\) 中。

posted @ 2024-11-14 08:13  CloudWings  阅读(16)  评论(0编辑  收藏  举报