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
    
    */
  • 相关阅读:
    markdown
    线段树模板
    Trie模板 UVALive 3942 Remember the Word
    使用swift写sprite Kit的模仿微信打飞机游戏
    Graffiti support page
    使用代码控制ScrollView的contentSize
    资料整理
    pd.to_sql()用法
    如何将表格的数据导入到mysql
    安装启动MySQL8.0,报错:1053
  • 原文地址:https://www.cnblogs.com/kimsimple/p/7137438.html
Copyright © 2011-2022 走看看