[poj] [01分数规划] Dropping tests
题目
传送门
题目大意
可从n场考试中选n-k+1场
使得∑ai/∑bi最大
解题思路
二分枚举一个最大比值x
使得∑ai/∑bi >=x
转移可得∑a>=∑bi *x
也就是∑ai-∑bi x>=0
从大到小快排求出前n-k+1个的ai-bix
判断是否大约等于0
代码
#include<algorithm>
#include<iostream>
#include<cstdio>
using namespace std;
int n,k,a[1020],b[1020];
double f[1020];
bool check(double x)
{
double ans=0;
for (int i=1;i<=n;i++) f[i]=a[i]-x*b[i];
sort(f+1,f+n+1);
for (int i=n;i>=k+1;i--) ans+=f[i];
return ans>=0;
}
int main()
{
scanf("%d%d",&n,&k);
while (k|n)
{
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;
while (r-l>1e-6)
{
double mid=(l+r)/2; //枚举的比值
if (check(mid))
l=mid;
else r=mid;
}
int da=l*100+0.5; //+0.5四舍五入
printf("%d\n",da);
scanf("%d%d",&n,&k);
}
return 0;
}