1. 程式人生 > >0914-01分數規劃-POJ2976

0914-01分數規劃-POJ2976

傳送門

分析

這個就是典型的01分數規劃,最最普通的那種

(題外話:poj真的有毒……不要用 lf 輸出)

而且我也不知道怎麼講啊……

直接上程式碼吧

程式碼

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#define N 1009
#define eps 1e-10
using namespace std;
int n,k,a[N],b[N];
double c[N];
bool check(double r){
	double ans=0;
	for(int i=1;i<=n;++i)	c[i]=a[i]-r*b[i];
	sort(c+1,c+n+1);
	for(int i=n;i>k;--i)	ans+=c[i];
	if(ans>=0) return 1;
	return 0;
}
int main(){
	while((scanf("%d%d",&n,&k)),n|k){
		for(int i=1;i<=n;++i)	scanf("%d",&a[i]);
		for(int i=1;i<=n;++i)	scanf("%d",&b[i]); 
		double l=0,r=1,ans;
		/*int t=50;
		while(t--){//針對浮點數這類的二分,最好限定二分次數,不然很容易死掉 
			double mid=(l+r)/2.0;
			if(check(mid)) ans=mid,l=mid+1;
			else r=mid-1;
		}*/
		while(r-l>1e-6)
  		{
	        double mid=(l+r)/2;
	        if(check(mid)) l=mid; else r=mid;
   		}

		printf("%.0f\n",100*l);//然後poj真的有毒,千萬不要用lf輸出
	}
	return 0;
}