01分数规划及其应用

看一道题,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\n",l*100);
32     }
33     return 0;
34 }

猜你喜欢

转载自www.cnblogs.com/aininot260/p/9569362.html