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<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#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<n;i++)
    {
        y[i]=p[i].v-p[i].w*x;
    }
    sort(y,y+n,cmp);
    double s=0;
    for(int i=0;i<k;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<n;i++)
	{
            scanf("%lf%lf",&p[i].w,&p[i].v);
            if(ma<p[i].v/p[i].w) 
			ma=p[i].v/p[i].w;
        }
        printf("%.2lf\n",Search(ma));
    }
    return 0;
}//全部定义成double型,便于计算
        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值