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;
}


 

 

你可能感兴趣的:(test)