NYOJ 914 Yougth的最大化
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
分析:
要想取得单位重量价值最大,须要在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的最大化的更多相关文章
- NYOJ 914 Yougth的最大化【二分/最大化平均值模板/01分数规划】
914-Yougth的最大化 内存限制:64MB 时间限制:1000ms 特判: No 通过数:3 提交数:4 难度:4 题目描述: Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从 ...
- NYIST 914 Yougth的最大化
Yougth的最大化时间限制:1000 ms | 内存限制:65535 KB难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? ...
- ACM Yougth的最大化
Yougth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价 ...
- Yougth的最大化(好题,二分查找 0 1分数规划)
Yougth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价 ...
- nyoj 1189 yougth和他的朋友们 (DP)
题目:pid=1189" target="_blank">nyoj 1189 yougth和他的朋友们 这题目是14年北京赛区的原题.讲题的时候说有三种解法,我们是 ...
- 问题 L: Yougth的最大化
题目描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入 有多组测试数据 每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和V ...
- nyoj914Yougth的最大化(二分搜索 + 贪心)
Yougth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗 ...
- nyoj--914--Yougth的最大化(二分查找)
Yougth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最 ...
- poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分
poj 2456 Aggressive cows && nyoj 疯牛 最大化最小值 二分 题目链接: nyoj : http://acm.nyist.net/JudgeOnline/ ...
随机推荐
- 编译kernel:配置
韦东山Linux视频第1期_裸板_UBoot_文件系统_驱动初步\第10课第2节 内核启动流程分析之配置.WMV 下面以DM9000的配置为例: 在一个编译好的内核代码里,寻找CONFIG_DM900 ...
- Python 基础编程
Python 打印九九乘法表: for i in range(1,10): for j in range(1,i+1): print j,'*',i,'=',j*i,' ', print '\n' P ...
- Server-side Sessions with Redis | Flask (A Python Microframework)
Server-side Sessions with Redis | Flask (A Python Microframework) Server-side Sessions with Redis By ...
- poj 3263 Tallest Cow
一个压了很久的题目,确实很难想,看了别人的做法后总算明白了. 首先要明白一点,因为题目说明了不会有矛盾,所以题目给出来的区间是不能相交的,否则是矛盾的.(原因自己想) 然后既然区间只能是包含的,就很明 ...
- swap函數 进阶探讨与实现
相信以下這個C程序非常多人都見過啦.當時自己看 美少女战士谭浩强 写的那本书上的解释.反正我当时是没看太懂详细是什么意思.谱架啊~~~ #include <stdio.h> void sw ...
- Struts 2最新0day破坏性漏洞(远程任意代码执行)等的重现方法
Struts 2的远程任意代码执行和重定向漏洞,是这两天互联网上最重大的安全事件,据说国内互联网企业中,很多电商纷纷中招,应该已经有大规模的用户隐私泄露.这里我们简单总结下怎样在自己机子上重现这些漏洞 ...
- 基于visual Studio2013解决C语言竞赛题之1088模拟计算器
题目 解决代码及点评 /************************************************************************/ /* ...
- [置顶] Objective-C ,/,ios,/iphone开发基础:协议(protocol)
protocol协议时为了补充Objective-C 只能单继承的缺陷而增加的一个新功能.Objective-C重所有的方法都是虚方法,所以在oc重也就没有关键字 virtual一说,有了协议可以补充 ...
- Python Base64转码解码
Python Base64 提供了好几种方法例如: encode, decode, encodestring, decodestring, b64encode, b64decode, standard ...
- io 测试
//其中能够实现编码的只有OutputStreamWriter和对应inputStreamReader package net; import java.io.BufferedWriter; impo ...