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

分析:

要想取得单位重量价值最大,须要在0-Max之间二分搜索。Max为随意选物品所得的单位重量最大价值。

Max = max(v[i] / w[i] | i = 0...n - 1)。

为什么Max如此取值,以下证明:

如果一对vi。wi 满足: vi / wi = max(v[i] / w[i] | i = 0......n-1),任取一对 vk。wk (k != i),则有vi / wi > vk / wk,

即:vi * wk > vk * wi 把它记为公式1。

证明:

要证的是 (vi + vk1 +...+ vk2) / (wi + wk1 +...+ wk2) <= vi / wi, (0<=k1<=k2<=n-1 && k1 != i && k2 != i),

1.当k1 = k2 = 0 时,即不添加。上式等号成立。

2.为便于证明,此处仅仅添加vk(k != i),它具有普通性。即证(vi + vk) / (wi + wk) < vi / wi,

即wi(vi + vk) < vi(wi + wk)。也就是vi * wk > vk * wi,此式即为公式1。成立!

3.当添加2......n-1 个数时也成立。

4.证毕。

对于cleck(a)若不理解见代码以下具体解释。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 10000 + 5;
double x[maxn], w[maxn], v[maxn]; //全定义为double,便于计算
int n, k;
bool cleck(double a){
for(int i = 0; i < n; i++) x[i] = v[i] - a * w[i];
sort(x, x + n);
double sum = 0;
for(int i = 0; i < k; i++) sum += x[n - i - 1]; //贪心,由大到小取
return sum >= 0 ? true : false;
}
int main()
{
while(~scanf("%d%d", &n, &k)){
double Max = 0;
for(int i = 0; i < n; i++){
scanf("%lf%lf", &w[i], &v[i]);
Max = max(Max, v[i] / w[i]);
}
double L = 0, R = Max;
while(R - L > 1e-4){ //二分查找最优值
double M = (L + R) / 2;
if(cleck(M)) L = M;
else R = M;
}
printf("%.2lf\n", L);
}
return 0;
}

cleck(a)为检查单位重量价值a是否可取。若可取。需满足

(vk1 +...+ vk2) / (wk1 +...+ wk2) >= a (0<=k1<=k2<=n-1),

即vk1 +...+ vk2 >= a(wk1 +...+ wk2),

即vk1 - a * wk1 +...+ vk2 - a * wk2 >= 0

所以尽量取vki - a * wki(即代码中xi)大的才有可能满足。

NYOJ 914 Yougth的最大化的更多相关文章

  1. NYOJ 914 Yougth的最大化【二分/最大化平均值模板/01分数规划】

    914-Yougth的最大化 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:4 难度:4 题目描述: Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从 ...

  2. NYIST 914 Yougth的最大化

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

  3. ACM Yougth的最大化

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

  4. Yougth的最大化(好题,二分查找 0 1分数规划)

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

  5. nyoj 1189 yougth和他的朋友们 (DP)

    题目:pid=1189" target="_blank">nyoj 1189 yougth和他的朋友们 这题目是14年北京赛区的原题.讲题的时候说有三种解法,我们是 ...

  6. 问题 L: Yougth的最大化

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

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

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

  8. nyoj--914--Yougth的最大化(二分查找)

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

  9. poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分

    poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分 题目链接: nyoj : http://acm.nyist.net/JudgeOnline/ ...

随机推荐

  1. Java__jar包的简单操作

    工作需要研究了下jar,这里就举个简单的例子,以helloworld为例吧 1.启动eclipse编写代码: 次步不做赘述 package cn.test.jar; public class Hell ...

  2. mysql 初识之日志文件篇

    日志文件 1. err日志     error log 记录mysql在运行的过程中所有较为严重的警告和错误信息,以及mysql server每次启动和关闭的详细信息.系统在默认情况下关闭error ...

  3. 第十一章 认识与学习BASH

    系统支持的shell在   /etc/shells里面 Bash Shell 的功能: 1.命令修补能力(histroy) 2.命令与档案补全功能 3.命令别名设定功能 4.工作前景背景控制 5.支持 ...

  4. MSSQL - 创建新用户

    1.首先使用Windows身份验证登陆. 2.然后一次打开:安全性--->登录名.右键登录名,点击新建登录名. 3.常规选项卡下:填写登录名.选择SQL Server身份验证,填写登录名密码.取 ...

  5. javascript iframe 视频解码

    function confirmVdo(){ var videoVal = $(".video_src").val(); if(videoVal){ videoVal = vide ...

  6. Hadoop MapReduce编程的一些个人理解

    首先要实现mapreduce就要重写两个函数,一个是map 还有一个是reduce map(key ,value) map函数有两个參数,一个是key,一个是value 假设你的输入类型是TextIn ...

  7. 微软C#版SQLHelper.cs类

    转载自:http://blog.csdn.net/fengqingtao2008/article/details/17399247 using System; using System.Data; u ...

  8. tar打包过滤某个文件及文件夹

    ip=ip add|grep eth0|grep -i inet|awk '{print $2}'|cut -d '/' -f 1 cd /data tar -zvcf `echo $ip`_`dat ...

  9. HDU1027 Ignatius and the Princess II 【next_permutation】【DFS】

    Ignatius and the Princess II Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K ( ...

  10. mfc控件与其对应的对象的关联方法

    对话框的控件与其对应类的对象相关联:(两种方法) (1)      通过CWnd::DoDataExchange函数进行关联: 用VC++6.0的MFC ClassWizard中的Member Var ...