码迷,mamicode.com
首页 > 其他好文 > 详细

最大化平均值

时间:2017-07-08 18:44:12      阅读:174      评论:0      收藏:0      [点我收藏+]

标签:void   最大值   fine   std   logs   ++   algorithm   最大   sum   

 

 

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

*/

 

最大化平均值

标签:void   最大值   fine   std   logs   ++   algorithm   最大   sum   

原文地址:http://www.cnblogs.com/kimsimple/p/7137438.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!