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 最大化平均值 二分思想的更多相关文章

  1. POJ 3111 K Best 最大化平均值 [二分]

    1.题意:给一共N个物品,每个物品有重量W,价值V,要你选出K个出来,使得他们的平均单位重量的价值最高 2.分析:题意为最大化平均值问题,由于每个物品的重量不同所以无法直接按单位价值贪心,但是目标值有 ...

  2. POJ 3111 K Best(最大化平均值)

    题目链接:click here~~ [题目大意]有n个物品的重量和价值各自是Wi和Vi.从中选出K个物品使得单位重量的价值最大,输出物品的编号 [解题思路]:最大化平均值的经典.參见click her ...

  3. POJ 3111 K Best(01分数规划)

    K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 9876   Accepted: 2535 Case Time ...

  4. poj 3111 K Best (二分搜索之最大化平均值之01分数规划)

    Description Demy has n jewels. Each of her jewels has some value vi and weight wi. Since her husband ...

  5. poj3111 K Best 最大化平均值,二分

    题目:http://poj.org/problem?id=3111 题意:给你n,k,n个数的v.w值,选出k个数,使得v之和/w之和最大化. 思路:一看到题目,这不是赤果果的贪心吗?为什么放在二分专 ...

  6. POJ 3111 K Best(二分答案)

    [题目链接] http://poj.org/problem?id=3111 [题目大意] 选取k个物品,最大化sum(ai)/sum(bi) [题解] 如果答案是x,那么有sigma(a)>=s ...

  7. POJ - 3111 K Best 0-1分数规划 二分

    K Best Time Limit: 8000MS   Memory Limit: 65536K Total Submissions: 12812   Accepted: 3290 Case Time ...

  8. POJ 3111 K Best ( 二分 )

    题意 : 给出 N 个物品的价值和重量,然后要求选出 K 个物品使得选出来物品的单位重量价值最大,最后输出被选物品的编号. 分析 :  很容易去想先算出每个物品的单位价值然后升序排序取前 K 个,但是 ...

  9. 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 ...

随机推荐

  1. MongoDB原子操作

    MongoDB原子操作常用命令: 1. $set: 用来指定一个键并更新键值,若键不存在则创建并赋值. { $set : { field : value } } 2. $unset: 用来删除一个键. ...

  2. LeetCode 74. Search a 2D Matrix(搜索二维矩阵)

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the follo ...

  3. Redis基本认识和基础学习-基本命令

    Redis 基本介绍 REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统. Redis是一个开源的使用ANS ...

  4. css左侧固定宽度,右侧自适应的几种实现方法

    左侧固定,右侧自适应或者右侧固定在,左侧自适应是一样的.这种布局很常见,而且面试过程中也经常会问到,这里我总结的方法一共有5种.要实现这种布局,也算比较简单.我们先给出html结构: <div ...

  5. spring mvc+mybatis+maven集成tkmapper+pagehelper

    <!-- maven tkmapper引入--> <dependency> <groupId>tk.mybatis</groupId> <arti ...

  6. datagrid参数queryParams--easyUI

    datagrid参数queryParams--easyUI Html          <div  region="center" border="false&qu ...

  7. Warning: connect.static is not a function

    grunt-contrib-connect从0.11.x版本开始不支持connect.static和connect.directory 你应该安装serve-static(加载静态文件)和serve- ...

  8. Appium python自动化测试系列之混合app实战(十一)

    12.1 什么是混合App 12.1.1 混合app定义 什么是混合app,其实这个不言而喻,我们的app正常来说应该都是native的,但是实际工作中却不是,反正种种原因我们的app会有native ...

  9. 理解typename的两个含义

    理解typename的两个含义 问题:在下面的 template declarations(模板声明)中 class 和 typename 有什么不同? template<class T> ...

  10. Python基础学习参考(二):基本语法

    一.基本语法 既然是学习一门语言,它肯定有区别与其它语言的语法规则,现在就来解释一下python的语法规则是什么? 注释:通过"#"可以对python进行注释,注意是单行注释,如果 ...