poj Dropping tests 01分数规划—Dinkelbach算法

  • Post author:
  • Post category:其他


果然比二分要快将近一倍。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;
}



版权声明:本文为xiaozhuaixifu原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。