Neo-Robin Hood

官方题解写的是真菜。。。

但还是解释一下,将人按照\(m\)降序排序之后,我们再固定一个点\(i\),只考虑抢的人来自前\(i\)个,那么前\(i\)个人中剩下的\(i-k\)个人中,一定是都被帮助的,否则如果存在一个啥都没做的人,我们可以选择在当前已经抢了的人当中少选一个人抢,然后去抢这个啥都没做的人,不会遗漏最优的答案空间

然后按照\(m+p\)排序的原因如下:我们主要是考虑如何将前面\(i\)个人分成两个交集为空的集合,其中一个集合\(A\)全抢,另一个集合\(B\)全帮,那么剩下的钱就是\(\sum_{i∈A} m_i-\sum_{i∈B} p_i\),显然要这个值越大越好,我们加上抢的人的\(p\),再在最终的结果减去,即\(\sum_{i∈A} (m_i+p_i)-\sum_{i∈B} p_i-\sum_{i∈A} p_i\),化简就是\(\sum_{j∈A} (m_j+p_j)-\sum_{j=1}^{i}p_j\),当\(i\)的时候后面一个是常量,所以最大化前面一个就好了

代码的细节比较多,可以看一下

但是下面这个思路其实更自然,也就是按照贪心的思路去搞

update 2024.7.13

重新做这道题目的时候做出来了,上面图片说的用优先队列维护可以想一下怎么维护,具体见CF提交代码

心路历程:像这种一个物品有买和卖的选项,就可以像下面这么想。我们不妨假设先把物品全买了,这个时候就负债了,再考虑卖掉一些物品,此时不仅不用支付这些物品买入的价格,还会得到这些物品卖出的价格,于是总增量为买入价格加上卖出价格,也就是\(m+p\),所以按照\(m+p\)排序

当然这只是帮忙找出如何排序的,想的时候就不要禁锢在一定要先全部买入再卖出,这道题目这么做就做不出来,于是就像图片那样子想就好了

posted @ 2024-03-30 14:35  最爱丁珰  阅读(1)  评论(0编辑  收藏  举报