NYOJ 914 Yougth的最大化 【贪心】+【二分】

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

思路:最后的结果肯定不大于每种物品的单价,我们只需要枚举从0到maxn之间的值就可以了。

代码:

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
const int M = 1e4+10;
const double e = 1e-3;

struct node{
	double w, v, rat;
}s[M];
double y[M];

bool cmp(double a, double b){
	return a > b;
}

bool judge(double x, int n, int k){
	int i;
	for(i = 0; i < n; ++ i)
		y[i] = s[i].v- x*s[i].w;
	double sum = 0;
	sort(y, y+n, cmp);
	for(i = 0; i < k; ++ i) sum += y[i];
	if(sum > 0) return 1;
	else return 0;
}

double bs(double l, double r, int n, int k){
	double mid = (l+r)/2;
	int tem = 100;
	while(r - l > e){
		if(judge(mid, n, k)){
			l = mid;
		}
		else r = mid;
		mid = (l+r)/2;
	}
	return r;
}

int main(){
	int n, k;
	while(scanf("%d%d", &n, &k) == 2){
		int i;
		double maxn = 0;
		for(i = 0; i < n; ++ i){
			scanf("%lf%lf", &s[i].w, &s[i].v);
			if(maxn < s[i].v/s[i].w) maxn = s[i].v/s[i].w;
		}
		double ans = bs(0, maxn, n, k);
		printf("%.2lf\n", ans);
	}
	return 0;
}        
时间: 2024-10-06 02:57:59

NYOJ 914 Yougth的最大化 【贪心】+【二分】的相关文章

NYOJ 914 Yougth的最大化

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 分析:

NYIST 914 Yougth的最大化

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 22 25 32 1 样例输出0.75 来源Yougth 上传者TC

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的最大化(好题,二分查找 0 1分数规划)

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 1 #in

二分搜索(2、Yougth的最大化,无限逼近最大值)

条件C(x):=可以选择是单位重量的价值不小于x,则该问题就变成了满足C(x)的最大的x,那么怎么判断C(x)是否可行呢?假设我们选了某个物品的集合S,那么它们的单位重量价值是: 因此就变成了判断是否存在s满足下面条件: 把这个不等是进行变形就得到 //#define LOCAL #include<cstdio> //#include<iostream>注意引入头文件,编译时候需要连接,是费内存的,如果不需要尽量不要引入 #include<algorithm> int

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满足下面的条件:\[

Card Game Cheater(贪心+二分匹配)

Card Game Cheater Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1566    Accepted Submission(s): 822 Problem Description Adam and Eve play a card game using a regular deck of 52 cards. The rule

nyoj 1189 yougth和他的朋友们 (DP)

题目:nyoj 1189 yougth和他的朋友们 这题目是14年北京赛区的原题,讲题的时候说有三种解法,我们是用dp做的当时,原题目链接:Happy Matt Friends 题意就不在说了.因为要求的是满足条件的种数. 我们定义状态dp[i][j]:当我们把第 i 个数放进去之后得到 j 的种数是多少 那么我们可以得到状态转移方程:dp[i][j^ a [ i ] ] += dp[i-1][j] 就是当前得到每个 j ^  a [ i ] 有前 i-1 个数得到.整个dp一遍就是得到结果了.

贪心/二分查找 BestCoder Round #43 1002 pog loves szh II

题目传送门 1 /* 2 贪心/二分查找:首先对ai%=p,然后sort,这样的话就有序能使用二分查找.贪心的思想是每次找到一个aj使得和为p-1(如果有的话) 3 当然有可能两个数和超过p,那么an的值最优,每次还要和an比较 4 注意:不能选取两个相同的数 5 反思:比赛时想到了%p和sort,lower_bound,但是还是没有想到这个贪心方法保证得出最大值,还是题目做的少啊:( 6 */ 7 #include <cstdio> 8 #include <algorithm>