zoukankan      html  css  js  c++  java
  • 最大化平均值

    ///4.最大化平均值
    /**
        Q:有n个价值和重量为vi、wi的物品,从中挑选k个使单位重量的价值最大
    
        A:
        此题不能直接用贪心法:直接按物品的单位价值排序,然后依次取k个;
        我们要求的最大值是,价值之和/重量之和;而上面所说是单位价值之和。
        ------------------------------------------变形贪心
        二分搜索法模型:
        条件C(x):可以挑选使得单位重量的物品价值不小于x->求满足条件的最大x->如何判断C(x)
        价值和/重量和>=x
        价值和-重量和*x>=0
        和(价值-重量*x)>=0
        可以对(价值-重量*x)的值进行贪心的选取,选取最大的k个 和>=0
    
    */
    #include "iostream"
    #include "cstdio"
    #include "algorithm"
    using namespace std;
    #define MAX 100010
    #define INF 0x3f3f3f3f
    int N,K;
    int w[MAX],v[MAX];
    double y[MAX];
    
    bool C(double x)
    {
        for(int i=0;i<N;i++)
            y[i]=v[i]-w[i]*x;
        sort(y,y+N);
    
        ///取k个
        int t=N-1-K;
        double sum=0;
        for(int i=N-1;i>t;i--)
        {
            sum+=y[i];
        }
        return sum>=0;
    }
    void solve()
    {
        double lb=0,ub=INF,mid;
        for(int i=0;i<100;i++)
        {
            mid=(lb+ub)/2;
            if(C(mid))
                lb=mid;
            else
                ub=mid;
        }
        printf("%.2f
    ",ub);
    }
    int main()
    {
        while(~scanf("%d%d",&N,&K))
        {
            for(int i=0;i<N;i++)
                scanf("%d%d",&w[i],&v[i]);
            solve();
        }
        return 0;
    }
    /**
    3 2
    2 2
    5 3
    2 1
    
    0.75
    
    */
  • 相关阅读:
    P1030 求先序排列 P1305 新二叉树
    spfa
    Clairewd’s message ekmp
    Cyclic Nacklace hdu3746 kmp 最小循环节
    P1233 木棍加工 dp LIS
    P1052 过河 线性dp 路径压缩
    Best Reward 拓展kmp
    Period kmp
    Substrings kmp
    Count the string kmp
  • 原文地址:https://www.cnblogs.com/kimsimple/p/7137438.html
Copyright © 2011-2022 走看看