poj Dropping tests 01分数规划---Dinkelbach算法
果然比二分要快将近一倍。63MS。二分94MS。
#include <iostream> #include <algorithm> #include <cstdio> #include <ctime> #include <cstdlib> #include <cmath> using namespace std; const int maxn=1005; double a[maxn],b[maxn]; const double eps=1e-6; int n,k; struct dnode{ double x; int index; }d[maxn]; bool cmp(dnode a,dnode b){ return a.x>b.x; } int main() { while(scanf("%d%d", &n, &k) != EOF) { if(n+k==0)break; for(int i=0;i<n;i++) scanf("%lf", &a[i]); for(int i=0;i<n;i++) scanf("%lf", &b[i]); double l=0.5,ans; do{ ans=l; for(int i=0;i<n;i++) {d[i].x=a[i]-ans*b[i]; d[i].index=i; } sort(d,d+n,cmp); double p=0,q=0; for(int i=0;i<n-k;i++) { p+=a[d[i].index]; q+=b[d[i].index]; } l=p/q; }while(fabs(ans-l)>=eps); printf("%.0f\n", l * 100); } return 0; }