二分法求最大化平均值
2015-06-05 18:14
399 查看
有n个物品,每个物品分别对应一个重量和价值。要求选出k个,使得平均每单位重量的价值最大。
思路:
设k的集合是S ,使得平均值最大,即 Vs/Ws 最大。枚举答案x,Vs/Ws>=x,即 Vs – Ws*x>=0 成立。二分x即可。
代码:
思路:
设k的集合是S ,使得平均值最大,即 Vs/Ws 最大。枚举答案x,Vs/Ws>=x,即 Vs – Ws*x>=0 成立。二分x即可。
代码:
[code]#include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <math.h> #include <ctype.h> #include <time.h> #include <queue> #include <iterator> #include <vector> #include <set> using namespace std; const int MAXN = 100000; const double INF = 1e9; int n, k; struct node { double w; double v; }p[MAXN]; bool cmp2(double a, double b) { return a > b; } double tmp[MAXN]; int c(double x) { for (int i = 0; i < n; i++) { tmp[i] = p[i].v - x*p[i].w; } sort(tmp,tmp+n,cmp2); double sum = 0; for (int i = 0; i < k; i++) sum += tmp[i]; if (sum >= 0) return 1; return 0; } void solve() { double down = 0, up = INF; for (int i = 0; i < 100; i++) { double mid = (up + down)/2; if (c(mid)) down = mid; else up = mid; } printf("%.3lf",down); } int main() { while (cin >> n >> k) { for (int i = 0; i<n; i++) cin >> p[i].w >> p[i].v; solve(); } return 0; }
相关文章推荐
- 网页
- yii框架数据循环添加
- 关于ListView中含有CheckBox,Button等控件失去焦点的解决办法
- (转载)UITableView的详细讲解
- c#去掉小数点后的无效0
- ListView使用注意事项
- 动态创建二维vector数组
- JQuery设置数据滑动展示效果
- Square:从今天开始抛弃Fragment吧!
- 南阳 水仙花数
- hdu 3336 Count the string 【kmp + dp】
- poj 2229 Sumsets【DP】
- Android与IOS异同点对比(1)------ 显示
- E430(c) 修改版BIOS刷入攻略
- hdu 2554 N对数的排列问题 【数学】
- Gradle添加so文件
- Linux系统抓包命令tcpdump使用实例
- 关于缓冲区溢出(Buffer Overflow)
- Codeforces Round #301 C (Div. 2) 【dfs】
- BaseExpandableListAdapter的用法