POJ2976:Dropping tests——题解
http://poj.org/problem?id=2976
题目大意:给定n个二元组(a,b),从中取n-k个,使得100*∑a/∑b最大。
01分数规划裸题,设λ是小于等于最优解的,那么λ<=∑a/∑b,先通过移项来得到新的表达法∑a-λ∑b>=0。
就可以二分答案做了。
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; typedef double dl; const int N=1005; const dl eps=1e-7; dl a[N],b[N],t[N]; int n,k; double solve(dl l,dl r){ while(r-l>eps){ dl mid=(l+r)/2; for(int i=1;i<=n;i++)t[i]=a[i]-mid*b[i]; sort(t+1,t+n+1); dl sum=0; for(int i=k+1;i<=n;i++)sum+=t[i]; if(sum>0)l=mid; else r=mid; } return r; } int main(){ while(scanf("%d%d",&n,&k)!=EOF&&n+k){ for(int i=1;i<=n;i++)scanf("%lf",&a[i]); for(int i=1;i<=n;i++)scanf("%lf",&b[i]); printf("%.f\n",solve(0,1)*100); } return 0; }