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-1分数规划问题,用二分+贪心求解
首先必须知道单位重要的的最大价值的取值范围,其最小为0,最大不超过单个物品的单位重量的最大价值
证明如下:
  假设第i个物品的单位重量的价值最大,则对于任意的第j个物品的有Vj/Wj<=Vi/Wi 即 Vi*Wj-Vj*Wi >= 0

则j,i两个物品的单位重量的价值为(Vi+Vj)/(Wi+Wj),
Vi/Wi-(Vi+Vj)/(Wi+Wj) = (Vi*Wj-Vj*Wi)/(Wi*(Wi+Wj)) >=0
Vi/Wi>=(Vi+Vj)/(Wi+Wj)
故单位重量的的最大价值不超过单个物品的单位重量的最大价值
找到单位重量的的最大价值的范围既可以用二分搜索找到满足条件的值即可
由于(v1+v2+...+vk)/(w1+w2+...+wk) = value
则(v1+v2+...+vk)=value*(w1+w2+...+wk)
二分搜索时
如果value比单位重量的最大值大,则
(v1+v2+...+vk)-value*(w1+w2+...+wk) < 0 说明所求的值小于value
如果value比单位重量的最大值小,则
(v1+v2+...+vk)-value*(w1+w2+...+wk) > 0 说明所求值大于value

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <cstdio>
using namespace std; struct Good{
float w;
float v;
Good(double ww=0.0, double vv=0.0):w(ww),v(vv){}
}; vector<Good> goods();
int n,k; bool judge(float value){
vector<float> diffValue(n);
for(int i = ; i < n; ++ i)
diffValue[i] = goods[i].v-goods[i].w*value;
sort(diffValue.begin(),diffValue.end());
float sum = accumulate(diffValue.rbegin(),diffValue.rbegin()+k,0.0);
return sum >= ? true:false;
} float binarySearch(float maxv){
float left = , right = maxv;
for(int i = ; i < ; ++ i){
float mid =(left+right)/;
if(judge(mid)) left = mid;
else right = mid;
}
return left;
} int main(){
while(cin >>n >> k){
float maxv = ;
for(int i = ; i < n; ++i){
cin >>goods[i].w >>goods[i].v;
maxv = max(maxv,goods[i].v/goods[i].w );
}
printf("%0.2f\n",binarySearch(maxv));
}
}


              

ACM Yougth的最大化的更多相关文章

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

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

  2. NYOJ 914 Yougth的最大化

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

  3. NYIST 914 Yougth的最大化

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

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

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

  5. 问题 L: Yougth的最大化

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

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

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

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

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

  8. [ACM] POJ 3258 River Hopscotch (二分,最大化最小值)

    River Hopscotch Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 6697   Accepted: 2893 D ...

  9. ACM 最大化平均值问题总结

    主要是应用c(x)的满足条件有共通之处: c(x)表示要求解的那个表达式不小于x 可以找到表达式 v/w>=x 如果 v-x*w>0 说明有贡献 那就把贡献最大的找出来 如果找出来之后 s ...

随机推荐

  1. .net学习笔记---xml操作及读写

    一.XML文件操作中与.Net中对应的类 微软的.NET框架在System.xml命名空间提供了一系列的类用于Dom的实现. 以下给出XML文档的组成部分对应.NET中的类: XML文档组成部分 对应 ...

  2. 11g 使用rman duplicate复制数据库,创建辅助实例

    一,创建所需目录 1)创建审计文件目录 PROD1@dbrac1 /dsg/oracle11$ cd $ORACLE_BASE/admin PROD1@dbrac1 /u01/app/oracle/a ...

  3. HDU3364 Lanterns(求矩阵的秩)

    求矩阵的秩,及判断有无解 #include<cstdio> #include<iostream> #include<cstdlib> #include<cst ...

  4. MyEclipse 选中右侧编辑的文件时自动展开左侧目录树

  5. annotation-config 和 component-scan 的区别

    <context:annotation-config> 和 <context:component-scan>是Spring Core里面的两个基础概念,每个使用者都有必要理解怎 ...

  6. Go 中的反射要点

    简介 反射是元数据编程的一种形式,指的是程序获得本身结构的一种能力.不同语言的反射模型实现不一样,本文中的反射,仅仅指的是Go语言中的反射模型. 类型以及接口 这个基本概念需要清晰,这里不详细展开. ...

  7. hdu 5291 dp+优化 ****

    多校实在高能 题解链接 题意:有n中糖果,每种糖果有ai个.分给A,B两个人.两人的糖果要一样多,可以都是0,1......m个.同一种糖果没有区别. 问有几种分法. 定义dp[i]表示两人之间相差i ...

  8. linux命令执行返回值(附错误对照表)

    转自:http://blog.sina.com.cn/s/blog_6739945f0100zt4b.html 在 Linux 下,不管你是启动一个桌面程序也好,还是在控制台下运行命令,所有的程序在结 ...

  9. 中断处理流程,ok6410

    中断处理流程 CPU在工作的过程中,经常需要与外设进行交互,交互的方式包括”轮询方式”,”中断方式”. 1.轮询方式: CPU不断地查询设备的状态.该方式实现比较简单,但CPU利用率很低,不适合多任务 ...

  10. C++读取txt文件

    1. 逐行读入 void readTxt(string file) { ifstream infile; infile.open(file.data()); //将文件流对象与文件连接起来 asser ...