链接:https://www.nowcoder.com/acm/contest/93/I
wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个,问你在所有可能选取的方案中,最大的单位价值为多少(单位价值为选取的k个物品的总价值和总重量的比值)
答案显然是一个分数规划,分子分母都是线性的函数。那么知道是分数规划以后,显然常规做法,二分答案即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 100000 + 5;
struct node
{
int w, v;
double ave;
bool operator < (const node &other)const
{
return ave > other.ave;
}
}nodes[maxn];
bool judge(double mid, int n, int k)
{
for(int i = 0; i < n; i++) nodes[i].ave = nodes[i].v - mid * nodes[i].w;
sort(nodes, nodes + n);
double ans = 0;
for(int i = 0; i < k; i++) ans += nodes[i].ave;
return ans > 0;
}
int main()
{
int T;
scanf("%d", &T);
while(T--)
{
int n, k;
scanf("%d%d", &n, &k);
for(int i = 0; i < n; i++) scanf("%d%d", &nodes[i].w, &nodes[i].v);
double lb = 0, rb = 2e9;
while(fabs(rb - lb) > 1e-6)
{
double mid = (lb + rb) / 2;
if(judge(mid, n, k)) lb = mid;
else rb = mid;
}
printf("%.2f\n", lb);
}
return 0;
}