POJ2976 Dropping tests 01分数规划

二分答案ans,可让精度恶心死我了

找到使a[i]-l*b[i]最大的l。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 using namespace std;
 5 
 6 const double eps = 1e-7;
 7 
 8 int n,k;
 9 double ans,a[1010],b[1010],d[1010];
10 
11 int main(){
12     while(true){
13         cin >> n >> k;
14         if(n == 0&&k == 0)break;
15         for(int i = 1;i <= n;i++)scanf("%lf",&a[i]);
16         for(int i = 1;i <= n;i++)scanf("%lf",&b[i]);
17         double l = 0.0,r = 1.0,mid;
18         for(int i = 1;i <= 300;i++){
19             mid = (l+r)/2;
20             for(int i = 1;i <= n;i++)d[i] = a[i]-mid*b[i];
21             sort(d+1,d+n+1); 
22             double sum = 0.0;
23             for(int i = k+1;i <= n;i++)sum += d[i];
24             if(sum >= -eps)ans = mid,l = mid;
25             else r = mid;
26         }
27         printf("%.0f\n",ans*100);
28     }    
29 return 0;
30 }

猜你喜欢

转载自www.cnblogs.com/Wangsheng5/p/11787243.html
今日推荐