题目意思:

pid=914">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

题目分析:

此题直接对单位价格进行贪心会出现故障,并且不难从例子上看出来。因为k个物品的单位价格一定不大于最大单位价格的物品,

并且一定会大于0,因此能够用二分搜素+贪心来解题。

详细细节见凝视

AC代码:

/**

 *贪心+二分搜索

 */

#include<iostream>

#include<cstring>

#include<cstdio>

#include<algorithm>

#define exp 1e-5

using namespace std;

typedef struct node{

    double w,v;

}node;

node 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){//二分搜索最大的且最恰当的值是否合理。if(合理)证明还有继续加大的空间,能够继续增大

    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;//或者return r;此时l=r

}

int main()

{

    while(scanf("%d%d",&n,&k)!=EOF){

        double ma=0;//k个最大平均值一定小于等于单个最大价值且大于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;

}

nyoj914(二分搜索+贪心)的更多相关文章

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

    Yougth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗 ...

  2. uvalive 3971 - Assemble(二分搜索 + 贪心)

    题目连接:3971 - Assemble 题目大意:有若干个零件, 每个零件给出的信息有种类, 名称, 价格, 质量,  现在给出一个金额, 要求在这个金额范围内, 将每个种类零件都买一个, 并且尽量 ...

  3. ACM 疯牛

    疯牛 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小 ...

  4. 问题 L: Yougth的最大化

    题目描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入 有多组测试数据 每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和V ...

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

    Youth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? ...

  6. CF 990B. Micro-World【数组操作/贪心/STL/二分搜索】

    [链接]:CF [题意]:对任意一个数a[i] ,可以对任意 满足 i != j 且 a[i] > a[j] && a[i] <= a[j] +k 的 a[j] 可以被删掉 ...

  7. hihoCoder #1053 : 居民迁移(贪心,二分搜索,google在线技术笔试模拟)

    #1053 : 居民迁移 时间限制:3000ms 单点时限:1000ms 内存限制:256MB 描述 公元2411年,人类开始在地球以外的行星建立居住点.在第1326号殖民星上,N个居住点分布在一条直 ...

  8. K Best(最大化平均数)_二分搜索

    Description Demy has n jewels. Each of her jewels has some value vi and weight wi. Since her husband ...

  9. poj 2976 Dropping tests (二分搜索之最大化平均值之01分数规划)

    Description In a certain course, you take n tests. If you get ai out of bi questions correct on test ...

随机推荐

  1. jboss <context /> 配置虚拟路径,映射本地文件

    这个目录下的server.xml <host><host/>标签中添加: <Context path="/file" docBase="D: ...

  2. VUE:项目的创建、编写、打包及规范检查

    VUE:项目的创建.编写及打包 项目的创建 使用 vue-cli 创建模板项目(官方提供的脚手架工具) https://github.com/vuejs/vue-cli npm install -g ...

  3. jpa自定义条件分页查询

    主要依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>sp ...

  4. ZOJ 3435

    求(1,1,1)至(x,y,z)的互质个数. 即求(0,0,0)到(x-1,y-1,z-1)互质个数. 依然如上题那样做.但很慢...好像还有一个分块的思想,得学学. #include <ios ...

  5. 非典型的scala程序及其编译后的结果

    初学Scala Folder structure以及部分代码 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY2xldmVyd3lx/font/5a6L5L ...

  6. WPF错误:必须使“Property”具有非 null 值。

    这个问题一般出如今Triggers中Property指定的类型为Nullable. 解决的方法就是用DataTrigger取代Trigger, 然后用Binding+Converter转换为详细非Nu ...

  7. linux中sed的使用方法具体解释(对行数据的加入、删除等)

    sed使用语法 [root@fwq test]# sed --help 使用方法: sed [选项]... {脚本(假设没有其它脚本)} [输入文件]... -n, --quiet, --silent ...

  8. 关于 折半查找 while 条件 &lt; , &lt;=

    int bin_search(int a[],int len,int key) { int low=0; int high=len-1; while(low<=high) //若为low< ...

  9. Popupwindow 显示, 其它背景变暗。 并加上点击事件 ~ (用于记录)

    public class MainActivity extends Activity implements OnClickListener { protected int mScreenWidth; ...

  10. NOIP2017提高组模拟赛 8(总结)

    NOIP2017提高组模拟赛 8(总结) 第一题 路径 在二维坐标平面里有N个整数点,Bessie要访问这N个点.刚开始Bessie在点(0,0)处. 每一步,Bessie可以走到上.下.左.右四个点 ...