Codeforces 1106 E
题意:有\(k\)个红包,第\(i\)个红包可以在\(s_i\)到\(t_i\)的时间内抢,同时获得\(w_i\)的钱,但是抢完以后一直到\(d_i\)都不可以继续抢,\(bob\)从\(1\)到\(n\)的时间内可以抢红包,他的策略是在第\(i\)个时间点内找\(w_i\)最大的红包,如果有相同找\(d_i\)最大的,再相同就随便挑,但是\(alice\)可以在最多\(m\)个时间点内打扰\(bob\),在\(alice\)打扰的那个时间点内\(bob\)无法抢红包,问\(bob\)能获得的最少钱数。
思路:首先确定\(bob\)在第\(i\)个时间点会取哪个红包,把所有红包按题意排好序后遍历一遍,到第\(i\)个红包时就把\(s_i\)到\(t_i\)刷成i,用并查集来实现区间染色,然后考虑\(dp\):\(dp(i,j)\)表示在前\(i\)个时间点中,\(bob\)被\(alice\)打扰了\(j\)次,\(bob\)所能获得的最差钱数,然后状态转移方程就分两种情况考虑:
\(dp(i+1,j+1)=min(dp(i,j),dp(i+1,j+1))\)
\(dp(d_{best_i}+1,j)=min(dp(i,j)+w_{best_i},dp(d_{best_i}+1,j))\)
反思:题意中加粗的地方。原来只是求了\(dp(n,m)\),但其实是\(min_{j=0}^m dp(n,j)\),然后还把\(j\)写成\(m\)了。