nyoj914(二分搜索+贪心)

题目意思:

acm.nyist.net/JudgeOnline/problem.php?pid=914

现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗?

输入
有多组测试数据

每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi。

(1<=k=n<=10000) (1<=Wi,Vi<=1000000)

输出
输出使得单位价值的最大值。(保留两位小数)
样例输入
3 2
2 2
5 3
2 1
样例输出
0.75

题目分析:

此题直接对单价进行贪心会出现问题,而且不难从样例上看出来。由于k个物品的单价一定不大于最大单价的物品,

而且一定会大于0,因此可以用二分搜素+贪心来解题。具体细节见注释

AC代码:

/**

*贪心+二分搜索

*/

#include<iostream>

#include<cstring>

#include<cstdio>

#include<algorithm>

#define exp 1e-5

using namespace std;

typedef struct node{

double w,v;

}node;

node p[10005];

double y[10005];

int n,k;

int cmp(double a,double b){

if(a>b) return 1;

return 0;

}

int Judge(double x){//二分搜索最大的且最恰当的值是否合理,if(合理)证明还有继续加大的空间,可以继续增大

for(int i=0;i<n;i++){

y[i]=p[i].v-p[i].w*x;

}

sort(y,y+n,cmp);

double s=0;

for(int i=0;i<k;i++){

s+=y[i];

}

if(s>=0) return 1;

else return 0;

}

double Search(double ma){

double l=0,r=ma;

while(r-l>exp){

double mid=(l+r)/2;

if(Judge(mid)){//当前值还小,还要增大

l=mid;

}

else{//当前值大了,需要减小

r=mid;

}

}

return l;//或者return r;此时l=r

}

int main()

{

while(scanf("%d%d",&n,&k)!=EOF){

double ma=0;//k个最大平均值一定小于等于单个最大价值且大于0

for(int i=0;i<n;i++){

scanf("%lf%lf",&p[i].w,&p[i].v);

if(ma<p[i].v/p[i].w) ma=p[i].v/p[i].w;

}

printf("%.2lf\n",Search(ma));

}

return 0;

}

时间: 2024-08-04 18:28:06

nyoj914(二分搜索+贪心)的相关文章

nyoj914Yougth的最大化(二分搜索 + 贪心)

Yougth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入 有多组测试数据 每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi. (1<=k=n<=10000) (1<=Wi,Vi<=1000000) 输出 输出使得单位价值的最大值.(保留两位小数) 样例输入 3 2 2 2 5 3 2 1 样例输出 0.75 来源 Yo

NYOJ Yougth的最大化

http://acm.nyist.net/JudgeOnline/problem.php?pid=914 Yougth的最大化 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入 有多组测试数据 每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi. (1<=k=n<=10000) (1<=Wi,Vi<=1000000) 输出 输出使

Yougth的最大化

1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 #include <cmath> 5 6 using namespace std; 7 8 #define N 10010 9 10 double w[N],v[N],ave[N]; 11 int k,n; 12 double max1; 13 14 int check(double x) 15 { 16 double sum

问题 L: Yougth的最大化

题目描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入 有多组测试数据 每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi. (1<=k=n<=10000) (1<=Wi,Vi<=1000000) 输出 输出使得单位价值的最大值.(保留两位小数) 样例输入 3 2 2 2 5 3 2 1 样例输出 0.75 1 /*解题思路: 2 3 这道题目是一道0-1分数规划求最优值.方法是一个二分搜索+贪心的题目

【贪心专题】POJ 2456 Aggressive cows &amp;&amp; NYOJ 586 疯牛(最大化最小值 贪心+二分搜索)

链接: click here~~ 题意:农夫 John 建造了一座很长的畜栏,它包括N (2 <= N <= 100,000)个隔间,这些小隔间依次编号为x1,...,xN (0 <= xi <= 1,000,000,000). 但是,John的C (2 <= C <= N)头牛们并不喜欢这种布局,而且几头牛放在一个隔间里,他们就要发生争斗.为了不让牛互相伤害.John决定自己给牛分配隔间,使任意两头牛之间的最小距离尽可能的大,那么,这个最大的最小距离是什么呢? [解题

【贪心专题】POJ 3258 River Hopscotch (最大化最小值 贪心+二分搜索)

链接:click here~~ [题意] 一条河长度为 L,河的起点(Start)和终点(End)分别有2块石头,S到E的距离就是L,河中有n块石头,每块石头到S都有唯一的距离,,现在要你移除其中的m块,使得具有最小间距的相邻两块石头之间的距离最大. [解题思路] 又是一道经典的二分搜索,跟前一道一样的思路,不过要注意的是:此题是移除其中的元素,从而达到最大化的最小值. 代码: #include <stdio.h> #include <string.h> #include <

NYOJ-914 Youth的最大化(贪心)

Youth的最大化 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 Yougth现在有n个物品的重量和价值分别是Wi和Vi,你能帮他从中选出k个物品使得单位重量的价值最大吗? 输入 有多组测试数据 每组测试数据第一行有两个数n和k,接下来一行有n个数Wi和Vi. (1<=k=n<=10000) (1<=Wi,Vi<=1000000) 输出 输出使得单位价值的最大值.(保留两位小数) 样例输入 3 2 2 2 5 3 2 1 样例输出 0.75 贪心策略:

CF 990B B. Micro-World【数组操作/贪心/STL/二分搜索】

[链接]:CF [题意]:对任意一个数a[i] ,可以对任意 满足 i != j 且 a[i] > a[j] && a[i] <= a[j] +k 的 a[j] 可以被删掉,求使最终剩下的个数最少. [分析]:扫一遍,二分搜索合法的. [代码]: #include<cstdio> #include<string> #include<cstdlib> #include<cmath> #include<iostream>

hihoCoder #1053 : 居民迁移(贪心,二分搜索,google在线技术笔试模拟)

#1053 : 居民迁移 时间限制:3000ms 单点时限:1000ms 内存限制:256MB 描述 公元2411年,人类开始在地球以外的行星建立居住点.在第1326号殖民星上,N个居住点分布在一条直线上.为了方便描述,我们设第i个居住点的位置是Xi,其中居住着Yi位居民.随着冬季的到来,一些人口较多的居住点的生态循环系统已经开始超负荷运转.为了顺利度过严冬,殖民星上的居民一致同意通过转移到人口较少的居住点来减轻人口众多的居住点的负荷. 遗憾的是,1326殖民星的环境非常恶劣.在冬季到来前,每个