贪心题目

贪心题目

CF2166C Cyclic Merging

尽可能用较小的数来进行较多的合并操作。所以把数按从小到大的顺序删去,删去时选择和较小的一边合并。

合并的过程用双向列表维护就好了。

P3462 [POI 2007] ODW-Weights

对于每个 \(m_j\),尽可能选择一个当前最小的可以装下 \(m_j\)\(w_i\),将 \(w_i\) 修改为 \(w_i-m_j\)

这个过程可以转化为进制借位的过程。

P1650 田忌赛马

最大化赢得局数,大概的贪心思路:尽可能保留较快的马,能赢就赢,不能赢尽可能用慢马去输。

具体的,我们将田忌的马力 \(x[i]\) 和齐王的马力 \(y[j]\) 都从小到大排序,那么:

  • \(x[r_x] > y[r_y]\),可以赢就赢,否则之后可能赢不了了。
  • \(x[r_x] < y[r_y]\),必输局,用最小的马力去换。
  • \(x[r_x]==y[r_y]\),要么平,要么还是用最小的马力去换。
    • 如果 \(x[l_x] > y[l_y]\),能赢就赢,这样避免了之后用较快的马去对决。
    • 否则,只能用最小的马去换。

这里注意一个点:到最后有 \(l_x=r_x,l_y=r_y\) 并且 \(x[r_x]==y[r_y]\),这时候是平局而非必输局。

P4823 [TJOI2013] 拯救小矮人

类似于反悔贪心的想法。

大体的贪心思路:让较弱者能上就上,不能上时让人梯尽可能的高。

具体的,我们按照 \(a_i+b_i\) 的总长升序排序,对于每一个 \(i\)

  • 当前 \(i\) 可以上去,那么就先让他上去。
  • 当前 \(i\) 上不去,考虑从之前上去的人中挑一个 \(j\) 的下来尝试送 \(i\) 上去,\(j\) 应满足 \(a_j \geq a_i\) 并且使 \(i\) 可以上去。

显然,这样做可以使人梯尽可能的高,因为上不去时我们扔一个下来又送一个上去,这样答案不变,但是人梯更高了。

P5749 [IOI 2019] 排列鞋子

很像冒泡排序对不对?那就尝试从逆序对个数入手。

用贪心来为每个鞋标号,重构原数组 \(S\)\(tmp\)\(k\) 表示已处理几对鞋,假设当前:

  • 按原数组的顺序扫描每个鞋。

  • 对于每一种尺寸,第 \(k\) 次出现的左鞋 \(u\) 与第 \(k\) 次出现的右鞋 \(v\) 匹配,令 \(tmp[u]=2k+1,tmp[v]=2k\),然后 \(k++\)

这样做到排序后配对的鞋在相邻的位置。且避免了每对鞋不必要的前移(贪心过程的第一点保证)。

之后求逆序对个数就好了。

顺带一提,在实现贪心过程的第二点时,讨论区说不能用 'deque'要用'vector',但我用'deque'也过了。

posted @ 2025-11-23 20:31  南北天球  阅读(4)  评论(0)    收藏  举报