0/1分数规划 【POJ2976】Dropping tests

时间:2021-12-15 18:40:11

题目大意:
给定两个长度为n的数组a,b.从中选出n-k个数使得sigema ai /sigema bi 最大。

题目分析:(0/1分数规划)
0/1分数规划传送门
一道裸题。
二分答案,算出d数组,从大往小取n-m个,判断F[L]。

代码如下(传送门对面貌似是Pascal选手=。=,c++版本如下供参考):

#include <cstdio>
#include <algorithm>
#include <iostream>
#define N 1200
using namespace std;
const double EPS=1e-5;
int n,m;
double a[N],b[N];
double d[N];
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0 && m==0) break;
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,r=0;
for(int i=1;i<=n;i++) r=(a[i]/b[i]>r)?(a[i]/b[i]):r;
while((r-l)>EPS)
{
double mid=(l+r)/2,tmp=0;
for(int i=1;i<=n;i++) d[i]=a[i]-mid*b[i];
sort(d+1,d+1+n);
for(int i=n;i>m;i--) tmp+=d[i];
if(tmp>0) l=mid;
else r=mid;
}
printf("%1.lf\n",l*100.0);
}
return 0;
}