nyoj914Yougth的最大化(二分搜索 + 贪心)

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 
来源 
Yougth

题解: 
Yougth的最大化 
这道题目是一道0-1分数规划求最优值。 
方法是一个二分搜索+贪心的题目。 
出这道题目就是告诉大家二分不仅可以查找,还可以搜索一个更优值。 
要使得单位重量的价值最大,则其最大不超过单个中最大的单位重量的价值,最小当然不小于0. 
那么我们就这一在0–最大单位重量的价值中间找一个值ans,使得ans为满足题目条件的最大值。如果满足条件,则可以找更大的。设置一个条件。既二分搜索、 
从n个物品中找k个使得k个的价值和/质量和>=ans 
为了使得ans尽可能的大,那么这里就要贪心选择。 
代码详见:

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 11000;
int w[N],v[N];
double y[N];
int n,c;
int chack(double x)
{
    for(int i=0;i<n;i++)
    {
        y[i]=v[i]-x*w[i];
    }
    sort(y,y+n);
    double sum=0;
    for(int i=0;i<c;i++)
    {
        sum+=y[n-i-1];
    }
    return sum>=0;
}
double reaerch(double enf)
{
    double l=0,r=enf,mid;
    for(int i=0;i<100;i++)
    {
        mid=(l+r)/2;
        if(chack(mid))
            l=mid;
        else
            r=mid;
    }
    return l;
}
int main()
{
    while(~scanf("%d%d",&n,&c))
    {
        double ma=0;
        for(int i=0;i<n;i++){
            scanf("%d%d",&w[i],&v[i]);
            double cmp=v[i]/w[i];
            if(cmp>ma)
                ma=cmp;
        }
        printf("%.2lf\n",reaerch(ma));
    }
    return 0;
}

时间: 2024-10-13 13:21:33

nyoj914Yougth的最大化(二分搜索 + 贪心)的相关文章

【贪心专题】POJ 2456 Aggressive cows &amp;&amp; NYOJ 586 疯牛(最大化最小值 贪心+二分搜索)

链接: click here~~ 题意:农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000). 但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗.为了不让牛互相伤害.John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢? [解题

【贪心专题】POJ 3258 River Hopscotch (最大化最小值 贪心+二分搜索)

链接:click here~~ [题意] 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L,河中有n块石头,每块石头到S都有唯一的距离,,现在要你移除其中的m块,使得具有最小间距的相邻两块石头之间的距离最大. [解题思路] 又是一道经典的二分搜索,跟前一道一样的思路,不过要注意的是:此题是移除其中的元素,从而达到最大化的最小值. 代码: #include <stdio.h> #include <string.h> #include <

NYOJ-914 Youth的最大化(贪心)

Youth的最大化 时间限制: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 贪心策略:

nyoj914(二分搜索+贪心)

题目意思: acm.nyist.net/JudgeOnline/problem.php?pid=914 现在有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 题目分析: 此

POJ 3258 最小值最大化 二分搜索

题意:牛要到河对岸,在与河岸垂直的一条线上,河中有N块石头,给定河岸宽度L,以及每一块石头离牛所在河岸的距离, 现在去掉M块石头,要求去掉M块石头后,剩下的石头之间以及石头与河岸的最小距离的最大值. 首先去理解题意,去除一些石头之后,使得跳跃的最短距离是最大的,这个跳跃的距离一定是一个值而且一定小于总距离,同时我们可以知道的是,如果移除某几块石头,以某一最短距离跳跃都满足的话,小于这个最短距离的话一定都满足,大于这个最短距离便不一定,所以二分搜索的好处在于可以精准地通过之前的判断对下一次的范围进

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 思路:

NYOJ Yougth的最大化

http://acm.nyist.net/JudgeOnline/problem.php?pid=914 Yougth的最大化 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入 有多组测试数据 每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi. (1<=k=n<=10000) (1<=Wi,Vi<=1000000) 输出 输出使

Yougth的最大化

1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 6 using namespace std; 7 8 #define N 10010 9 10 double w[N],v[N],ave[N]; 11 int k,n; 12 double max1; 13 14 int check(double x) 15 { 16 double sum

问题 L: Yougth的最大化

题目描述 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 1 /*解题思路: 2 3 这道题目是一道0-1分数规划求最优值.方法是一个二分搜索+贪心的题目