CodeForces 772A Voltage Keepsake

二分答案,验证。

二分到一个答案,比他小的时间都需要补充到这个时间,计算所需的量,然后和能提供的量进行比较。

#include <cstdio>
#include <cmath>
#include <set>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;

int n, p;
int a[100010],b[100010];

bool check(double x)
{
    double sum = 0;
    double t = 0;
    for(int i=1;i<=n;i++)
    {
        if(1.0*b[i]/a[i]>=x) continue;
        sum = sum + (x-1.0*b[i]/a[i])*a[i];
    }

    if(sum==0) return 1;
    
    if(sum<=x*p) return 1;
    return 0;
}

int main()
{
    scanf("%d%d",&n,&p);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&a[i],&b[i]);
    }

    double L = 0,R = 100000.0;
    R=R*R;

    double INF=R;

    double ans;
    int t=100;
    while(t--)
    {
        double mid = (L+R)/2;

        if(check(mid)) L=mid,ans=mid;
        else R=mid;
    }

    double eps = 1e-7;
    if(abs(ans-INF)<eps) printf("-1\n");
    else printf("%f\n",ans);

    return 0;
}

 

posted @ 2017-05-08 10:04  Fighting_Heart  阅读(307)  评论(0编辑  收藏  举报