【备战秋招】每日一题:塔子大厂真题模拟赛-第一题-魔法石(Ⅰ)

文章讲述了如何通过贪心算法解决一个关于魔法石的问题,即在给定的能量限制下,如何安排使用能量以最大化魔法石的总价值。首先对魔法石点亮后的价值增量进行排序,然后从最大增量开始累加,直到能量用完。如果增量为负,则忽略。最后给出了一段Python代码实现该算法,并提到了时间复杂度为O(nlogn)。
摘要由CSDN通过智能技术生成

为了更好的阅读体检,可以查看我的算法学习网
本题在线评测链接:P1211

题目内容

塔子哥有 n n n个魔法石,初始时魔法石的价值为 a i a_i ai.塔子哥还有 m m m点能量。对于每个能量,它可以用来点亮一颗魔法石。第 i i i个魔法石被第一次点亮后的价值为 b i b_i bi.请问塔子哥该如何安排手中的能量,使得魔法石的价值总和最大呢?

输入描述

第一行两个整数 n n n, m m m ( 1 ≤ n ≤ 1 e 5 , 0 ≤ m ≤ n 1 \leq n \leq 1e5 , 0 \leq m \leq n 1n1e5,0mn) , 分别代表魔法石的个数以及能量数量.

第二行 n n n个整数: a 1 , a 2 , . . . , a n a_1,a_2,...,a_n a1,a2,...,an , 代表这 n n n个魔法石初始价值

第三行 n n n个整数: b 1 , b 2 , . . . , b n b_1,b_2,...,b_n b1,b2,...,bn , 代表这 n n n个魔法石被点亮后的价值

1 ≤ a i , b i ≤ 1 e 9 1 \leq a_i , b_i \leq 1e9 1ai,bi1e9

输出描述

一行整数,代表最大价值。

样例1

输入

3 3
1 2 3
3 2 1

输出

8

样例2

输入

3 0
1 2 3
3 2 1

输出

6

思路:贪心

m = 0 m = 0 m=0,那么就是全选 a i a_i ai

m = 1 m = 1 m=1,可以视作先全选 a i a_i ai , 然后再选一个 Δ i = b i − a i \Delta_i = b_i - a_i Δi=biai 最大的

m > 1 m > 1 m>1 ,显然是全选 a i a_i ai 然后加上前 m m m大的 Δ i \Delta_i Δi 。注意可能存在 Δ i < 0 \Delta_i < 0 Δi<0的情况,需要忽略。这种就是我们不必用完 m m m次机会的情况。

做法:先将 a i a_i ai求和。然后对 Δ i = b i − a i \Delta_i = b_i - a_i Δi=biai降序排序,求和前 m m m大的 Δ i \Delta_i Δi

时间复杂度

排序: O ( n l o g n ) O(nlogn) O(nlogn)

代码

python

n , m = list(map(int , input().split()))
a = list(map(int , input().split()))
b = list(map(int , input().split()))
c = [b[i] - a[i] for i in range(n)]
c.sort()
ans = sum(a)
for i in range(n - 1 , n - 1 - m , -1):
	if c[i] > 0:
		ans += c[i]
print(ans)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

塔子哥学算法

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值