看一道题,POJ2976,放弃考试
给出n组ai和bi,去掉k个使得a的总和除以b的总和最大
也就是取(n-k)个数,最大化平均值
我们要确定的就是最优比率ratio,这个式子在求解的时候二分就好了
貌似有一个叫做最优比率生成树的东西?
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 const int maxn=1005; 6 int n,k; 7 int a[maxn],b[maxn]; 8 double c[maxn]; 9 bool check(double x) 10 { 11 for(int i=1;i<=n;i++) c[i]=a[i]-x*b[i]; 12 sort(c+1,c+n+1); 13 double ans=0; 14 for(int i=n;i>=k+1;i--) ans+=c[i]; 15 return ans>=0; 16 } 17 int main() 18 { 19 while(scanf("%d%d",&n,&k)==2) 20 { 21 if(n==0&&k==0) break; 22 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 23 for(int i=1;i<=n;i++) scanf("%d",&b[i]); 24 double l=0,r=1; 25 while(r-l>1e-6) 26 { 27 double mid=(l+r)/2; 28 if(check(mid)) l=mid; 29 else r=mid; 30 } 31 printf("%.0lf ",l*100); 32 } 33 return 0; 34 }