NYOJ 914题(贪心+二分搜索)Yougth的最大化 酒馆浪人的博客

先声明这不是水题,不是水题,真的是一道好题,巧妙利用了二分法搜索最大值

Yougth的最大化

时间限制: 1000 ms  |  内存限制: 65535 KB
难度: 4
描述

Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗?

输入
有多组测试数据
每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi。
(1<=k=n<=10000) (1<=Wi,Vi<=1000000)
输出
输出使得单位价值的最大值。(保留两位小数)
样例输入
3 2
2 2
5 3
2 1
样例输出
0.75
代码如下,已AC
#include
#include
#include
#include
#define exp 1e-5//二分法判断的标志
using namespace std;
typedef struct node//定义一个名字叫s的结构体
{
    double w,v;
}s;
s p[10005];
double y[10005];
int n,k;
int cmp(double a,double b)
{
    if(a>b) return 1;
    return 0;
}
int judge(double x)//二分法判断
{
    for(int i=0;i    {
        y[i]=p[i].v-p[i].w*x;
    }
    sort(y,y+n,cmp);
    double s=0;
    for(int i=0;i	{
        s+=y[i];
    }
    if(s>=0)
	return 1;
    else 
	return 0;
}
double Search(double ma)//二分法搜索最大值
{
    double l=0,r=ma;
    while(r-l>exp)
	{
        double mid=(l+r)/2;
        if(judge(mid))
		{
            l=mid;
        }
        else
		{
            r=mid;
        }
    }
    return l;
}
int main()
{
    while(scanf("%d%d",&n,&k)!=EOF){
        double ma=0;
        for(int i=0;i	{
            scanf("%lf%lf",&p[i].w,&p[i].v);
            if(ma			ma=p[i].v/p[i].w;
        }
        printf("%.2lf\n",Search(ma));
    }
    return 0;
}//全部定义成double型,便于计算
        

你可能感兴趣的:(HDU平台练习题)