码迷,mamicode.com
首页 > 其他好文 > 详细

nyoj-914-Yougth的最大化

时间:2014-11-25 23:06:37      阅读:292      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   io   ar   color   os   sp   for   

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)
输出
输出使得单位价值的最大值。(保留两位小数)
样例输入
3 2 
2 2 
5 3 
2 1
样例输出
0.75

 

解题思路:二分搜索,二分答案

 

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <string.h>
 4 
 5 struct P{
 6     double wi;
 7     double vi;
 8     double ave;
 9 }p[10010];
10 
11 int n, k, i;
12 double left, mid, right, a[10010];
13 
14 int cmp(const void *a, const void *b){
15     return *(double *)a > *(double *)b ? 1 : -1;
16 }
17 
18 bool check(double x){
19     for(i = 0; i < n; i++){
20         a[i] = p[i].vi - x * p[i].wi;
21     }
22     qsort(a, n, sizeof(a[0]), cmp);
23     double sum = 0.0;
24     for(i = 0; i < k; i++){
25         sum += a[n - 1 - i];
26     }
27     return sum >= 0 ? true : false;
28 }
29 
30 void solve(){
31     while((right - left) > 1e-9){
32         mid = (right + left) / 2.0;
33         if(check(mid)){
34             left = mid;
35         }
36         else{
37             right = mid;
38         }
39     }
40     printf("%.2lf\n", left);
41 }
42 int main(){
43 
44     while(scanf("%d %d", &n, &k) != EOF){
45         left = right = 0.0;
46         for(i = 0; i < n; i++){
47             scanf("%lf %lf", &p[i].wi, &p[i].vi);
48             p[i].ave = p[i].vi / p[i].wi;
49             right = right > p[i].ave ? right : p[i].ave;
50         }
51         solve();
52     }
53     return 0;

54 } 

nyoj-914-Yougth的最大化

标签:style   blog   http   io   ar   color   os   sp   for   

原文地址:http://www.cnblogs.com/angle-qqs/p/4121840.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!