POJ2976 Dropping tests(01分数规划)

题意

给你n次测试的得分情况b[i]代表第i次测试的总分,a[i]代表实际得分。

你可以取消k次测试,得剩下的测试中的分数为

问分数的最大值为多少。

题解

裸的01规划。

然后ans没有清0坑我半天。

 1 #include<iostream>
 2 #include<cstring>
 3 #include<cmath>
 4 #include<cstdio>
 5 #include<algorithm>
 6 using namespace std;
 7 const int N=2000;
 8 double a[N],b[N],c[N],ans;
 9 int n,k;
10 bool judge(double x){
11     double tmp=0;
12     for(int i=1;i<=n;i++){
13         c[i]=a[i]-x*b[i];
14     }
15     sort(c+1,c+1+n);
16     for(int i=k+1;i<=n;i++){
17         tmp+=c[i];
18     }
19     if(tmp>=0)return true;
20     else return false;
21 }
22 int main(){
23     scanf("%d%d",&n,&k);
24     while(n!=0||k!=0){
25         for(int i=1;i<=n;i++){
26             scanf("%lf",&a[i]);
27         }
28         for(int i=1;i<=n;i++){
29             scanf("%lf",&b[i]);
30         }
31         double l=0.00;double r=1.00;
32         ans=0;
33         while(1e-7<=r-l){
34             double mid=(l+r)/2;
35             if(judge(mid)){
36                 ans=mid; 
37                 l=mid+1e-7;
38             }
39             else r=mid-1e-7;
40         }
41         printf("%0.lf
",ans*100);
42         scanf("%d%d",&n,&k);
43     } 
44 }
View Code
原文地址:https://www.cnblogs.com/Xu-daxia/p/9418025.html