poj 3111 K Best 最大化平均值 二分思想
poj 3111 K Best 最大化平均值 二分思想
题目链接:
http://poj.org/problem?id=3111
思路:
- 挑战程序竞赛书上讲的很好,下面的解释也基本来源于此书
- 设定条件C(x):=可以选择使得单位重量的价值不小于x
- 如何判定C(x)是否可行
- 假设选了某个物品的集合是S,那么单位重量的价值是:$$ \sum\limits_{i \in S} {v_i } /\sum\limits_{i \in S} {w_i } $$
- 因此就变成了判断是否存在S满足下面的条件:$$ \sum\limits_{i \in S} {v_i } /\sum\limits_{i \in S} {w_i } \ge x $$
- 把这个不等式变形就得到:$$ \sum\limits_{i \in S} {(v_i - x + w_i )} \ge 0 $$
- 因此可以对\((v_i-x+w_i)\)的值进行排序贪心地进行选取,因此就变成了,满足条件的前k大项。
代码:
#include <iostream>
#include <algorithm>
#include <stdio.h>
using namespace std;
const int maxn = 100005;
const int INF = 1000006;
struct node {
int v,w,id;
double y;
bool operator < (const node& x) const {
return y>x.y;
}
} jew[maxn];
int n,k;
bool check(double x) {
for(int i=1;i<=n;++i) jew[i].y=jew[i].v-jew[i].w*x;
sort(jew+1,jew+1+n);
double sum=0;
for(int i=1;i<=k;++i) sum+=jew[i].y;
return sum>=0;
}
int main() {
scanf("%d %d",&n,&k);
for(int i=1;i<=n;++i) {
scanf("%d %d",&jew[i].v,&jew[i].w);
jew[i].id=i;
}
double l=0,r=INF;
for(int i=0;i<100;++i) {
double mid = (l+r)/2;
if(check(mid)) l=mid;
else r=mid;
}
for(int i=1;i<=k;++i) {
if(i==1) printf("%d",jew[i].id);
else printf(" %d",jew[i].id);
}
printf("\n");
return 0;
}
poj 3111 K Best 最大化平均值 二分思想的更多相关文章
- POJ 3111 K Best 最大化平均值 [二分]
1.题意:给一共N个物品,每个物品有重量W,价值V,要你选出K个出来,使得他们的平均单位重量的价值最高 2.分析:题意为最大化平均值问题,由于每个物品的重量不同所以无法直接按单位价值贪心,但是目标值有 ...
- POJ 3111 K Best(最大化平均值)
题目链接:click here~~ [题目大意]有n个物品的重量和价值各自是Wi和Vi.从中选出K个物品使得单位重量的价值最大,输出物品的编号 [解题思路]:最大化平均值的经典.參见click her ...
- POJ 3111 K Best(01分数规划)
K Best Time Limit: 8000MS Memory Limit: 65536K Total Submissions: 9876 Accepted: 2535 Case Time ...
- poj 3111 K Best (二分搜索之最大化平均值之01分数规划)
Description Demy has n jewels. Each of her jewels has some value vi and weight wi. Since her husband ...
- poj3111 K Best 最大化平均值,二分
题目:http://poj.org/problem?id=3111 题意:给你n,k,n个数的v.w值,选出k个数,使得v之和/w之和最大化. 思路:一看到题目,这不是赤果果的贪心吗?为什么放在二分专 ...
- POJ 3111 K Best(二分答案)
[题目链接] http://poj.org/problem?id=3111 [题目大意] 选取k个物品,最大化sum(ai)/sum(bi) [题解] 如果答案是x,那么有sigma(a)>=s ...
- POJ - 3111 K Best 0-1分数规划 二分
K Best Time Limit: 8000MS Memory Limit: 65536K Total Submissions: 12812 Accepted: 3290 Case Time ...
- POJ 3111 K Best ( 二分 )
题意 : 给出 N 个物品的价值和重量,然后要求选出 K 个物品使得选出来物品的单位重量价值最大,最后输出被选物品的编号. 分析 : 很容易去想先算出每个物品的单位价值然后升序排序取前 K 个,但是 ...
- POJ - 3111 K Best(二分)
包含一些ai和bi的集用S来表示,x = max(sigma(ai)/sigma(bi),i 属于S) ,k 表示S的大小,k= |S|. x和k之间具有单调性.k0 < k1 → x0 ≥ x ...
随机推荐
- 使用phpexcel类读写excel文件
使用原生php读写excel文件的博文地址: 基于使用原生php读写excel文件的不靠谱,本文将简单介绍如何使用第三方类库phpexcel来读写excel文件. 首先,需要到githut下载phpe ...
- javascript编写一个简单的编译器(理解抽象语法树AST)
javascript编写一个简单的编译器(理解抽象语法树AST) 编译器 是一种接收一段代码,然后把它转成一些其他一种机制.我们现在来做一个在一张纸上画出一条线,那么我们画出一条线需要定义的条件如下: ...
- Vue源码后记-其余内置指令(3)
其实吧,写这些后记我才真正了解到vue源码的精髓,之前的跑源码跟闹着玩一样. go! 之前将AST转换成了render函数,跳出来后,由于仍是字符串,所以调用了makeFunction将其转换成了真正 ...
- webpack学习(一)
1.首先建立一个webpack项目,然后新建文件demo2,在demo2下新建src文件,index.html文件,初始化项目 (npm init --yes)得到package.json 2.全局安 ...
- linux系统下解决getch()输入数值不回显示
在linux系统下开发C 程序却会遇到系统不支持conio.h头文件,无法使用getch()不回显函数.下面就演示如何构建函数实现数值输入不回显. #include <stdio.h> # ...
- openstack学习心得:keystone 常用命令(M版)
查看用户列表 openstack user list 查看用户具体信息 usage: openstack user show [-h] [-f {html,json,json,shell,table, ...
- Maven快速使用阿里云的代理maven仓库
自从开源中国的maven仓库挂了之后就一直在用国外的仓库,慢得想要砸电脑的心都有了.如果你和我一样受够了国外maven仓库的龟速下载?快试试阿里云提供的maven仓库,从此不在浪费生命…… 仓库地址: ...
- C#实现DirectShow技术开发准备
DirectShow组件在“C:\WINDOWS\system32”目录下的Quartz.dll动态库中,要使C#代码引用COM对象和接口,必须将COM类型库转换为.NET框架元数据,从而有效地创建一 ...
- vue2.0 带头冲锋(先穿鞋)
事先说明:这次截图纯手工敲打,可不容易了.刚学会站直,不穿鞋,不得直接摔个狗食屎.(皮糙肉厚也顶不住啊). 废话不多了 !开始学基础.学过anguler1.0 ,会比较容易学vue. 溶解使用的是 v ...
- Cache类缓存
此处主要总结System.Web.Caching.Cache类 该类是用于存储常用信息的类,HttpRuntime.Cache以及HttpContext.Current.Cache都是该类的实例. 该 ...