https://codeforces.com/gym/102916/problem/B
就是每个选一种,要求金子总和/时间总和最大
经典0/1分数规划
要精确到1e-9,外面的二分要从1e9二分到1e-9,没开long double 死循环了2发
#include<bits/stdc++.h>
using namespace std;
const int maxl=2e5+10;
const double eps=1e-10;
int n;
int a[maxl],b[maxl],c[maxl],d[maxl];
inline bool jug(long double x)
{
long double sum=0,mid=x;
for(register int i=1;i<=n;++i)
sum+=max(b[i]-a[i]*mid,d[i]-c[i]*mid);
return sum>-eps;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]);
long double l=0,r=1e9,mid;
while(l+eps<r)
{
mid=(l+r)/2;
if(jug(mid))
l=mid;
else
r=mid;
}
double ans=l;
printf("%.10f",ans);
return 0;
}