题目
分析
这道题目有一个很明显的特征,就是需要“贪心”:不管A类还是B类灯泡,如果它的“权重”大,肯定要优先选择!这样,在保证权重肯定大于1
的情况下,选择一个最大权重的灯泡,一定带来最大的收益(\(=权重-1\))。
同时,为了避免重复计算前k
个灯泡的总收益(\(=k个灯泡的总权重-k\)),我们应该考虑到用前缀和。
这是本题的第一个关键点。
第二个关键点,在于如何决定选A类灯泡还是B类灯泡。
考虑样例数据,并进行排序后计算了前缀和:
A类灯泡:
排序后:[1.9, 1.6, 1.4, 1.2]
前缀和:[0, 3.5, 4.9, 6.1]
B类灯泡:
排序后:[3.7, 2.0, 1.5, 1.4]
前缀和:[0, 3.7, 5.7, 7.2, 8.6]
注意,由于在点亮灯泡的时候,随机决定是点亮A类还是B类,所以,收益的最小值是由A/B收益中较小的那个决定的。这个特性决定了我们后续的指针移动策略。
如果:
- \(A[i]>B[j]\),此时的下限是\(B[j]-i-j\)。也许我们增加一组B类灯泡会更好。由于现在
B[j]
存放的是降序排列后的前缀和,所以我们不妨增加B类灯泡的组数,方法是:增加j
。。 - 反之,此时的下限是\(A[i]-i-j\)。也许我们增加一组A类灯泡会更好。由于现在
A[i]
存放的是降序排列后的前缀和,我们要增加i
。
这两个不同的下限的算法,也是本题的另一个要点。
答案
思考
这是一道非常好的综合题!