首页 > 代码库 > 最大化平均值

最大化平均值

 

 

///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

*/

 

最大化平均值