CodeForces 605 C.Freelancer's Dreams(三分)

来源:互联网 发布:苹果瞄准镜软件 编辑:程序博客网 时间:2024/06/07 14:09

Description
一个人要成为厉害的程序猿需要p点经验,买房需要q美元,现在有n种工作,第i种工作每天可以得到ai经验和bi美元,问最少工作多少天可以得到p点经验q美元
Input
第一行三个整数n,p,q表示工作数量以及该人需要的经验数和钱数,之后n行每行两个整数ai和bi表示第i种工作工作一天获得的经验数和钱数(1<=n<=1e5,1<=p,q<=1e6,1<=ai,bi<=1e6)
Output
输出最少工作天数
Sample Input
3 20 20
6 2
1 3
2 6
Sample Output
5.000000000000000
Solution
这里写图片描述
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 111111int n,p,q,a[maxn],b[maxn];double f(double y2){    double y1=1;    for(int i=1;i<=n;i++)y1=min(y1,(1.0-b[i]*y2)/a[i]);    return y1*p+y2*q;} int main(){    while(~scanf("%d%d%d",&n,&p,&q))    {        int Max=0;        for(int i=1;i<=n;i++)        {            scanf("%d%d",&a[i],&b[i]);            Max=max(Max,b[i]);        }        double l=0.0,r=1.0/Max,ll,rr;        for(int i=1;i<=55;i++)        {            ll=(l+r)*0.5,rr=(ll+r)*0.5;            if(f(ll)>f(rr))r=rr;            else l=ll;        }        printf("%.15f\n",f((l+r)*0.5));    }    return 0;}
0 0
原创粉丝点击