一、题目
1、题目描述
2、输入输出
2.1输入
2.2输出
3、原题链接
1282B2 - K for the Price of One (Hard Version)https://codeforces.com/problemset/problem/1282/B2 |
二、解题报告
1、思路分析
考虑优先买价格低的,所以先升序排序
定义状态f[i]为购买前i个商品的最小代价
前k - 1个商品不能用魔法,所以购买前k - 1个商品的最小代价就是前缀和
然后对于i >= k
最优花费为f[i] = f[i - k] + a[i]
因为如果要买第i个商品,那么无论用不用魔法都要加一次它的价格,那么反正都要花钱就花的有价值一点,[i - k + 1, i]打包购买
贪心思路和dp转移都比较好写,比较容易的一题
2、复杂度
时间复杂度: O(NlogN)空间复杂度:O(N)
3、代码详解
T = int(input())
for _ in range(T):
N, p, k = map(int, input().split())
a = list(map(int, input().split()))
a.sort()
f = [p + 1] * (N + 1)
f[0] = 0
res = 0
for i in range(1, N + 1):
if i < k:
f[i] = a[i - 1] + f[i - 1]
else:
f[i] = f[i - k] + a[i - 1]
if p >= f[i]:
res = i
print(res)