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\n",ans*100); 42 scanf("%d%d",&n,&k); 43 } 44 }