题目描述
有 n 个物品的体积和价值分别是 vi 和 wi,从中选出 k 个物品使得单位体积的价值最大
输入格式
第一行包含 2 个正整数 n,k。
第二行包含 n 个用空格分割的整数,表示物品的价值 wi
第二行包含 n 个用空格分割的整数,表示物品的体积 vi
输出格式
输出一个浮点数,表示选中 k 个物品的最大单位价值
注意,结果保留 2 位小数。
3 2
2 3 1
2 5 2
0.75
提示
【样例解释 1】
- 选择 1 号物品和 3 号物品
- 总价值: 2+1=3,总体积: 2+2=4
- 所以答案是: 4/3=0.75
- 贪心地选择单位价值最高的前 k 个物品是否正确?
请思考后再点击查看提示
- 设 ok(x)==true 表示可以选择 k 个物品使得单位价值不低于 x
- 若 x 满足条件 ok(x)==true,那么所有 x′≤x 必然也能满足条件 ok(x′)==true,符合二分搜索的条件
- 所以我们只需要判断 ok(x) 是否可行,即:
∑vi∑wi≥x,能否成立?
- ∑wi≥x⋅∑vi
- ∑(wi−x⋅vi)≥0
- 所以我们贪心地选择 wi−x⋅vi 最大的 k 个物品就好
- 每次判断需要执行一次 sort(),所以每次判断时间复杂度是 O(nlog(n))
数据规模与限制
- 1≤n≤104
- 1≤wi,vi≤105