为了更好的阅读体检,可以查看我的算法学习网
本题在线评测链接: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 1≤n≤1e5,0≤m≤n) , 分别代表魔法石的个数以及能量数量.
第二行 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 1≤ai,bi≤1e9
输出描述
一行整数,代表最大价值。
样例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=bi−ai 最大的
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=bi−ai降序排序,求和前 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)