最大化平均值

Posted kimsimple

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了最大化平均值相关的知识,希望对你有一定的参考价值。

 

 

///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\n",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

*/

 

以上是关于最大化平均值的主要内容,如果未能解决你的问题,请参考以下文章

取最大值(最小值)简介代码

VB中如何求最大值和最小值,我写了下面的代码可是只能求最大值和平均值。最小值一直显示0

POJ 3111 K Best 二分 最大化平均值

在c中获得最小值、最大值和平均值的函数

poj 3111 卖珠宝问题 最大化平均值

算法- 求解最大平均值的子树-经典dfs题目