【POJ】3111
来源:互联网 发布:最好的文档扫描软件 编辑:程序博客网 时间:2024/05/17 06:26
http://poj.org/problem?id=3111
有n个物品的重量和价值分别是wi和vi。从中选出k个物品使得单位重量的价值最大。
转换成判断是否存在选取K个物品的集合S满足下面的条件:
sigma(vi) / sigma(wi) >= x {vi∈S, wi∈S}
–> simga(vi - x*wi) >= 0
对 yi= vi - x*wi {1<=i<=n}从大到小排序,计算sum(yi) {1<=i<=k}
然后二分查找x。
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <queue>#include <algorithm>using namespace std;int n,k;int w[100005];int v[100005];struct Y{ double val; int id;}y[100005];bool cmp(struct Y a,struct Y b){ return a.val>b.val;}int ans[100005];bool ok(double x){ for (int i=0;i<n;i++){ y[i].val=v[i]-x*w[i]; y[i].id=i+1; } sort(y,y+n,cmp); double sum=0; for (int i=0;i<k;i++){ sum+=y[i].val; ans[i]=y[i].id; } return sum>=0;}int main(){ cin >> n >> k; for (int i=0;i<n;i++){ scanf("%d%d",&v[i],&w[i]); } double l=0,r=999999999; for (int i=0;i<50;i++){ double mid=(l+r)/2; if (ok(mid)) l=mid; else r=mid; } for (int i=0;i<k;i++){ cout << ans[i] << " "; }}
阅读全文
0 0
- POJ 3111
- POJ-3111
- poj 3111
- POJ 3111
- poj 3111
- 【POJ】3111
- POJ 3111
- poj 3111 迭代法
- POJ 3111 K Best
- poj 3111 K Best
- POJ 3111(二分)
- poj 3111(二分)
- poj 3111 最大化平均值
- POJ-3111K Best
- poj 3111 K Best
- POJ 3111K Best
- poj 3111 best(二分)
- poj 3111 (最大化平均值)
- Java中对Array数组的常用操作
- DirectFB学习之添加gfx驱动
- 给刚开始做微信公众平台推广新手的一些建议
- JarvisOJ basic部分WriteUp
- 1002. 写出这个数 (20)
- 【POJ】3111
- Git学习笔记(二)
- 关于Linux常用基础命令的总结
- JSP学习总结
- HDU 6166 Senior Pan (思维枚举+最短路 求最近点对)
- Python+Django实现文件的下载
- AtomicInteger研究
- wxpython和python连接oracle
- 英文学习20170825