标签: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