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

【二分查找-最大化平均值】POJ2976 - Dropping Test

时间:2015-09-15 23:35:13      阅读:427      评论:0      收藏:0      [点我收藏+]

标签:

【题目大意】

给出n组ai和bi,去掉k个使得a的总和除以b的总和最大。

【思路】

也就是取(n-k)个数,最大化平均值,见《挑战程序设计竞赛》P144,最后公式为c(x)=((ai-x*bi)从大到小排列的前(n-k)个的和不小于0)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 const int MAXN=10000+50;
 8 const int INF=1000000+50;
 9 int n,k;
10 int a[MAXN],b[MAXN];
11 
12 int c(double x)
13 {
14     double y[MAXN];
15     for (int i=0;i<n;i++) y[i]=a[i]-x*b[i];
16     sort(y,y+n);
17     double sum=0;
18     for (int i=0;i<(n-k);i++) sum+=y[n-i-1];
19     return sum>=0;
20 }
21 
22 void submain()
23 {
24     double lb=0,ub=INF;
25     for (int i=0;i<100;i++)
26     {
27         double mid=(lb+ub)/2;
28         if (c(mid)) lb=mid;
29                else ub=mid;
30     }
31     printf("%.0f\n",lb*100);
32 }
33 
34 int main()
35 {
36    while (scanf("%d%d",&n,&k))
37    {
38         if (n==k && k==0) break;
39         for (int i=0;i<n;i++) scanf("%d",&a[i]);
40         for (int i=0;i<n;i++) scanf("%d",&b[i]);
41         submain();
42    }
43    return 0; 
44 }

 

【二分查找-最大化平均值】POJ2976 - Dropping Test

标签:

原文地址:http://www.cnblogs.com/iiyiyi/p/4811781.html

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