1. 程式人生 > >POJ2976——Dropping tests(0/1分數規劃)

POJ2976——Dropping tests(0/1分數規劃)

傳送門

最簡單的分數規劃

對於最終答案ans,有

ans=Σai100Σbians=\frac{Σa_i*100}{Σb_i}

Σbians=Σai100Σb_i*ans=Σa_i*100

Σ(biansai100)=0Σ(b_i*ans-a_i*100)=0

那麼我們二分check就可以了

#include<cstring> 
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<stdio.h> #include<cstdio> using namespace std; #define eps 1e-9 double a[1005],b[1005],c[1005]; int n,k; inline int read(){ char ch=getchar(); int res=0; while(!isdigit(ch)) ch=getchar(); while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48),ch=getchar(); return res; } int
main(){ n=read(),k=read(); while(n!=0){ for(int i=1;i<=n;i++){ scanf("%lf",&a[i]); } for(int i=1;i<=n;i++){ scanf("%lf",&b[i]); } double l=0,r=100; while(l+eps<r){ double mid=(l+r)/2; for(int i=1;i<=n;i++){ c[i]=a[i]*100-b[i]*mid; } sort(c+1,c+1+n); double
trt=0; for(int i=n;i>k;i--){ trt+=c[i]; } if(trt>eps) l=mid; else r=mid; } printf("%.0lf\n",l); n=read(),k=read(); } }