POJ 2976

又发现新东西了哇咔咔

话说每天都能学到新的是不是因为我太弱了(什么都没见过%>_<%)

传说中的01分数规划问题的裸题。

从n组数中干掉k组数使最后的比例最大,于是二分答案排序一下再判定就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
double a[1005],b[1005],d[1005];
int n,k;
bool check(double l){
	for(int i=1;i<=n;i++)
	d[i]=a[i]-b[i]*l;
	sort(d+1,d+1+n);
	double x=0;
	for(int i=k+1;i<=n;i++)
	x+=d[i];
	return x>0;
}
int main(){
	while(scanf("%d%d",&n,&k)&&n){
		for(int i=1;i<=n;i++)
		scanf("%lf",&a[i]);
		for(int i=1;i<=n;i++)
		scanf("%lf",&b[i]);
		double l=0.0,r=1.0,mid;
		while(r-l>(1e-7)){
			mid=(l+r)*1.0/2;
			if(check(mid))l=mid;
			else r=mid;
		}
		printf("%.0f\n",mid*100);
	}
	return 0;
}


你可能感兴趣的:(POJ 2976)