比赛的时候写了好久的B发现别人CD都已经过一大片了,赶紧去看C,然后回过头来调B的bug,最后开E发现这场unrated了,溜了溜了。
A Lunar New Year and Cross Counting
思路:直接n2判断便可。
1 |
|
B Lunar New Year and Food Ordering
tags: 排序,模拟
思路:
- 首先对所有商品的价格和编号排序,把最便宜的且编号最小的放前面。
- 然后直接判断便可,如果不够,用一个指针维护当前最便宜的位置,然后统计贡献。
1 |
|
C Lunar New Year and Number Division
思路:要使得值最小,直接把最大最小组合起来便可。
1 |
|
D Lunar New Year and a Wander
思路:
- 由于要字典序尽可能小,我们只需要维护当前可达却未到达的点,按照编号维护便可,当一个点被访问之后,它所有可达的点变得可达。
- 显然这样贪心最优,复杂度O(m+nlogn)
1 |
|
E Lunar New Year and Red Envelopes
简单题意:
有k个红包,有n个时间点,对于每个红包,可以抢的时间范围是[s,t],价值为w,抢了之后只能到d时间后才能继续。
对于红包,能抢就抢,优先w最大的,再优先d最大的。
有m次阻止某一秒抢红包的操作。问最后最小收益是多少。
思路:
设 dp[j][i] 表示 在前 i 个时间点使用过 j 次屏蔽的最小收益。
我们需要知道在时间 i 可以抢的红包是确定的,简单证明
(口胡)如下:- 首先,假设没有屏蔽功能,那么每一个时间点,选择的红包都是一定确定的。
- 无法选择红包有2种情况,1是这个时间点没有被红包覆盖,2是这个时间点被前面被选的红包的d值覆盖,导致无法选。
- 引进屏蔽功能之后,原本在时间i就被抢的红包,可以被拖延到i+1甚至之后,我们假设它最多保留到时间A.t,在后面的时间里只要有一次没有屏蔽,这个红包依旧转移到A.d 。
- 不屏蔽这个红包,导致它被使用,需要移出队列吗?不需要!
- 因为如果已经使用了它,比它优先级低的且在队列里的红包一定都不会被使用,直到时间A.d+1。
- 所以我们只需要在时间A.s的时候把A扔进队列,在A.t+1的时间把A弹出队列便可。
转移方程:
- 如果有红包,屏蔽 $$ dp[j+1][i+1] = min(dp[j+1][i+1],dp[j][i]) $$
- 如果有红包,不屏蔽 $$ dp[j][A.d+1] = min(dp[j][A.d+1],dp[j][i]) $$
- 如果没红包 $$ dp[j][i+1] = min(dp[j][i+1],dp[j][i]) $$
1 |
|