100
#LS1078. 【入门】最大化平均值

【入门】最大化平均值

题目描述

nn 个物品的体积和价值分别是 viv_iwiw_i,从中选出 kk 个物品使得单位体积的价值最大

输入格式

第一行包含 22 个正整数 n,kn, k

第二行包含 nn 个用空格分割的整数,表示物品的价值 wiw_i

第二行包含 nn 个用空格分割的整数,表示物品的体积 viv_i

输出格式

输出一个浮点数,表示选中 kk 个物品的最大单位价值

注意,结果保留 22 位小数。

3 2
2 3 1
2 5 2
0.75

提示

【样例解释 1】

  • 选择 1 号物品和 3 号物品
  • 总价值: 2+1=32 + 1 = 3,总体积: 2+2=42 + 2 = 4
  • 所以答案是: 4/3=0.754 / 3 = 0.75
  • 贪心地选择单位价值最高的前 kk 个物品是否正确?
请思考后再点击查看提示
  • ok(x)==trueok(x) == true 表示可以选择 kk 个物品使得单位价值不低于 xx
  • xx 满足条件 ok(x)==trueok(x) == true,那么所有 xxx' \le x 必然也能满足条件 ok(x)==trueok(x') == true,符合二分搜索的条件
  • 所以我们只需要判断 ok(x)ok(x) 是否可行,即:
wivix,能否成立?\frac{\sum{w_i}}{\sum{v_i}} \ge x,能否成立?
  • wixvi\sum{w_i} \ge x \cdot \sum{v_i}
  • (wixvi)0\sum(w_i - x \cdot v_i) \ge 0
  • 所以我们贪心地选择 wixviw_i - x \cdot v_i 最大的 kk 个物品就好
  • 每次判断需要执行一次 sort(),所以每次判断时间复杂度是 O(nlog(n))O(nlog(n))

数据规模与限制

  • 1n1041 \le n \le 10^4
  • 1wi,vi1051 \le w_i, v_i \le 10^5