POJ 3111 K Best ( 二分 )
题意 : 给出 N 个物品的价值和重量,然后要求选出 K 个物品使得选出来物品的单位重量价值最大,最后输出被选物品的编号。
分析 :
很容易去想先算出每个物品的单位价值然后升序排序取前 K 个,但是很可惜这样的做法是错误的。
例如 : N = 3、K = 2、{ w、v } = { {2,2}、{5,4}、{2,1} },贪心的方法是选出 1、2,但是正确答案是选出1、3
这题的正确做法是利用二分,难点就在如何判定二分出来的每一个单位重量价值是否是一个可行答案
假设当前二分出来的答案是 x
那么就要求选出来的某 K 个物品的组合使得 ∑ vi / ∑ wi ≥ x 成立
变形得到 ∑ ( vi - wi * x ) ≥ 0
那么最后就变成了对于当前的 x 对所有物品的 vi - wi * x 进行排序
并判断前 K 大的是否大于等于 0 ,如果是则说明可行!
#include<algorithm>
#include<stdio.h>
#include<math.h>
using namespace std;
;
;
;
struct Jewel{ int id, v, w; }arr[maxn];
struct st{
double val; int id;
bool operator < (const st & rhs) const{
return this->val > rhs.val;
};
}c[maxn];
int N, K, ans[maxn];
bool OK(double key)
{
; i<=N; i++){
c[i].val = arr[i].v - arr[i].w * key;
c[i].id = arr[i].id;
}
sort(c+, c++N);
;
; i<=K; i++)
sum += c[i].val;
if(sum >= 0.0){
; i<=K; i++)
ans[i] = c[i].id;
return true;
}else return false;
}
int main(void)
{
while(~scanf("%d %d", &N, &K)){
; i<=N; i++){
if(i <= K) ans[i] = i;///注意要提前给 ans 赋上初值,因为 OK 函数可能永远不为真,例如所有物品的 v = 0
arr[i].id = i;
scanf("%d %d", &arr[i].v, &arr[i].w);
}
double L = 0.0;
double R = INF;
while(R - L > EPS){
double mid = ( R + L ) / 2.0;
if(OK(mid)) L = mid;
else R = mid;
}
; i<=K; i++){
printf("%d", ans[i]);
if(i < K) putchar(' ');
else putchar('\n');
}
}
;
}
POJ 3111 K Best ( 二分 )的更多相关文章
- poj 3111 K Best 最大化平均值 二分思想
poj 3111 K Best 最大化平均值 二分思想 题目链接: http://poj.org/problem?id=3111 思路: 挑战程序竞赛书上讲的很好,下面的解释也基本来源于此书 设定条件 ...
- POJ 3111 K Best(01分数规划)
K Best Time Limit: 8000MS Memory Limit: 65536K Total Submissions: 9876 Accepted: 2535 Case Time ...
- 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 最大化平均值 [二分]
1.题意:给一共N个物品,每个物品有重量W,价值V,要你选出K个出来,使得他们的平均单位重量的价值最高 2.分析:题意为最大化平均值问题,由于每个物品的重量不同所以无法直接按单位价值贪心,但是目标值有 ...
- 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 ...
- POJ 3111 K Best
二分,排序,贪心. 最优比率生成树,可以二分$+$贪心来实现,不过这样做精度不行. 如果是这样一个问题,该如何解决:问你$n$个里面选择$k$个,能否使得$\frac{{\sum\limits_{j ...
- poj 3111 K Best (二分搜索之最大化平均值之01分数规划)
Description Demy has n jewels. Each of her jewels has some value vi and weight wi. Since her husband ...
- POJ 3111 K Best(最大化平均值)
题目链接:click here~~ [题目大意]有n个物品的重量和价值各自是Wi和Vi.从中选出K个物品使得单位重量的价值最大,输出物品的编号 [解题思路]:最大化平均值的经典.參见click her ...
随机推荐
- VS2013启动 外接程序VMDebugger未能加载或导致了异常
故障现象:打开Visual Studio 2010后弹出错误框,外接程序VMDebugger未能加载或导致了异常,是否希望移除该外接程序,错误号:80004005.系统版本:WIN10 64位专业版, ...
- Spark启动流程(Standalone)- master源码
Master源码 package org.apache.spark.deploy.master //伴生类 private[deploy] class Master( override val rpc ...
- 极*Java速成教程 - (7)
Java高级特性 数组 在Java中,数组是一串连续的,不可改变长度的,对象被固定的,类型固定的连续空间.数组中的随机访问非常迅速,但为了速度放弃了灵活性.而效率也是数组最大的优点. 在使用泛型的容器 ...
- [BZOJ 3771] Triple(FFT+容斥原理+生成函数)
[BZOJ 3771] Triple(FFT+生成函数) 题面 给出 n个物品,价值为别为\(w_i\)且各不相同,现在可以取1个.2个或3个,问每种价值和有几种情况? 分析 这种计数问题容易想到生成 ...
- 本地代码推送到远程git仓库
# 1. 在远程新建一个代码仓库(如码云,github..) # 2. 将本地代码提交 git init git add * git commit -am "first init" ...
- Linux中的各种锁及其基本原理
Linux中的各种锁及其基本原理 1.概述 通过本文将了解到如下内容: Linux系统的并行性特征 互斥和同步机制 Linux中常用锁的基本特性 互斥锁和条件变量 2.Linux的并行性特征 Linu ...
- HeidiSQL
相关链接 https://www.heidisql.com/ - 官网 https://github.com/HeidiSQL/HeidiSQL - 源码 参考 ...
- java中的数据类型,基本数据类型及其包装类型
java中的8大基本类型及其包装类型 1,int--->Integer 2,byte--->Byte 3,short--->Short 4,long--->Long 5,cha ...
- python数据结构:pandas(1)
废话不说,直接上干货 一.数据结构 (1)Series:一维数组,与Numpy中的一维array类似.二者与Python基本的数据结构List也很相近.Series如今能保存不同种数据类型,字符串.b ...
- 【玩转Eclipse】——eclipse实现代码块折叠-类似于VS中的#region……#endregion
[玩转Eclipse]——eclipse实现代码块折叠-类似于VS中的#region……#endregion http://www.cnblogs.com/Micheal-G/articles/507 ...