标签:
【题目大意】
给出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