CF1574C Slay the Dragon

题意简述

给定一个数组,有若干次询问。对于每次询问,输入 xy,要求在原数组中对若干个数进行 +1,每次操作花费一枚金币。找到一个元素 a,使得 a>=x 且 除去 a 外数组的总和大于等于 y。求最少金币数。

先说几句

一道有点难的贪心、二分、排序。建议难度 普及。

解题思路

输入数组后,进行排序。 对于每一个 xy,在数组中二分查找 lower_bound x

k lower_bound(a, a+n, x)-a

Part 1: k=0

s 为除去 a[k] 的总和。如果 s<y,则所需金币数为 ys。否则不要花费金币。

Part 2: k<n

需要分情况考虑。

情况1

假设取英雄 k 打败龙。按照 Part 1 的方法计算金币数。

情况2

假设取英雄 k1 打败龙。按照 Part 1 的方法计算金币数。

只要输出上面两种情况的较小值就可以了。

Part 3: 没有可选的英雄打败龙(k=n

按照贪心思想,我们要选攻击力最大的英雄来打龙。

先计算出 s。如果 s<y,则保护城堡的金币数是 ys,打败龙的金币数是 xa[maxi],总共金币数就是 y-s+x-a[maxi]

否则,只需要花费英雄的金币,就是 x-a[maxi]

Part 4: 优化

必须按照下面的内容优化,否则会超时!

1.使用 inline 内联函数。

使用 inline 内联函数可以提高函数调用效率。

2.预处理 maxi 和数组总和。

预处理过后,就不必反复循环计算了。

3.输入输出优化。

就是这三条语句:

奉上代码

千万不要抄,小心棕名!


All Rights Reserved 2022 Wang Zhanrui