nyoj914 (二分最大化)
来源:互联网 发布:淘宝职业女装红色裙子 编辑:程序博客网 时间:2024/06/04 22:54
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=914
题意:
Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗?
思路:
很可能大家一拿到这个题目就是想到要贪心,算出每一个物品的单位重量价值。
然而这个是segma(vi)/segma(wi),这个想法并不正确。
还是不能理解的话可以看样例:
3 22 25 32 10.75如果直接贪心的话就是5 / 7,但是结果是(2 + 1)/(2 + 2) = 0.75 > 5 / 7;用挑战上的思路:枚举答案进行二分。假设d是小于ans的一个值,那么d符合segma(vi)/segma(wi) >= d,那么变换为 segma(vi - wi * d) >= 0;所以在进行计算的时候要针对每一个d进行排序,然后取出k个来。Code:#include<iostream>#include<cstdio>#include<algorithm>using namespace std;const int maxn = 1e4 + 10;struct Node{ double x,y; double val;}a[maxn];bool cmp(Node _x,Node _y){ return _x.val > _y.val;}int n,m;double calc(double d){ for(int i = 1; i <= n; i ++) a[i].val = a[i].y - d * a[i].x; sort(a+1,a+n+1,cmp); double ret = 0; for(int i = 1; i <= m; i ++) { ret += a[i].val; } return ret;}int main(){ while( ~ scanf("%d%d",&n,&m)) { for(int i = 1; i <= n; i ++) scanf("%lf%lf",&a[i].x,&a[i].y); double l = 0,r = 1e6; int T = 60; while(T --) { double mid = (l + r) / 2; if(calc(mid) >= 0) l = mid; else r = mid; } printf("%.2f\n",l); } return 0;}
阅读全文
0 0
- nyoj914 (二分最大化)
- NYOJ914 Yougth的最大化 (最大化平均值)
- nyoj914 yougth最大化
- nyoj914 Yougth的最大化
- 0-1分数规划(nyoj914 Yougth的最大化)
- 0-1分数规划(nyoj914 Yougth的最大化)
- nyoj914(二分搜索+贪心)
- nyoj914 二分搜索+贪心
- poj3273(二分最大化最小值)
- 最大化平均值(二分搜索)
- poj 3122 Pie 二分(最大化平均值)
- nyoj914Yougth的最大化(二分搜索 + 贪心)
- POJ3111 K Best 最大化平均值(二分)
- POJ2976 Dropping tests 最大化平均值(二分)
- UVALive 3971-Assemble- 最小值最大化(二分)
- POJ3111 K Best(二分 最大化平均值)
- POJ 2010(二分最大化中间值)
- Aggressive cows(二分查找最大化最小值)
- vim文件配置
- Unable to open debugger port (127.0.0.1:49688): java.net.BindException "Address already in use: JVM_
- java计算两个日期之前的天数(工作日),排除节假日和周末
- HDU 2102 A计划
- 496. Next Greater Element I+附hashmap用法
- nyoj914 (二分最大化)
- linux-centso-内核编译
- break语句和continue语句的用法和区别
- CentOS6.5下安装Tomcat服务器
- js基础
- 《Linux内核设计与实现》读书笔记(十)- 内核同步方法
- 排序算法---快速排序
- Android的ViewStub、include、merge使用与源码分析
- 51nod 1101 换零钱