I wyh的物品(分数规划)

链接: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;
}

猜你喜欢

转载自blog.csdn.net/qq_29556211/article/details/79929888
I
今日推荐