POJ-3111 K Best---二分求最大化平均值

题目链接:

https://cn.vjudge.net/problem/POJ-3111

题目大意:

卖宝救夫:Demy要卖珠宝,n件分别价值vi 重 wi,她希望保留k件使得

最大。

解题思路:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 const int INF = 1e7;
 7 const int maxn = 100005;
 8 int n, m;
 9 double w[maxn], v[maxn], y[maxn];
10 bool judge(double x)
11 {
12     for(int i = 1; i <= n; i++)
13         y[i] = v[i] - x * w[i];
14     sort(y + 1, y + n + 1);
15 
16     double sum = 0;
17     for(int i = 1, j = n; i <= m; i++, j--)
18         sum += y[j];
19     return sum >= 0;
20 }
21 struct node
22 {
23     double x;
24     int id;
25     bool operator <(const node& a)const
26     {
27         return x > a.x;
28     }
29 }ans[maxn];
30 int main()
31 {
32     cin >> n >> m;
33     for(int i = 1; i <= n; i++)
34         cin >> v[i] >> w[i];
35     double l = 0, r = INF;
36     for(int i = 0; i < 50; i++)
37     {
38         double mid = (l + r) / 2;
39         if(judge(mid))l = mid;
40         else r = mid;
41     }
42     for(int i = 1; i <= n; i++)
43     {
44         ans[i].id = i;
45         ans[i].x = v[i] - l * w[i];
46     }
47     sort(ans + 1, ans + n + 1);
48     printf("%d", ans[1].id);
49     for(int i = 2; i <= m; i++)
50     {
51         printf(" %d", ans[i].id);
52     }
53     puts("");
54     return 0;
55 }

 

posted @ 2018-05-04 10:47  _努力努力再努力x  阅读(203)  评论(0编辑  收藏  举报