题解:CF772A Voltage Keepsake

· · 题解

题目的意思很好理解,在这里不做说明。

二分答案

如果需要使用二分答案,必须要满足单调性。

如果 t 的时间满足题目的条件,那么小于 t 的时间一定满足,这就满足了单调性。

输出答案

如果 mid 满足条件则记录 mid 在二分后输出,如果答案是很大的值那就说明一直满足,可以无限使用,输出 -1

给出代码

#include <bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,p;
int a[N],b[N];
double l,r=1e10;
bool check(double z){//判断z是否合法
    double s=0;
    for(int i=1; i<=n; i++){
        if(a[i]*z>b[i]){
            s+=a[i]*z-b[i];
        }
    }
    return p*z>=s;
}
int main() {
    scanf("%d%d",&n,&p);
    for(int i=1; i<=n; i++){
        scanf("%d%d",&a[i],&b[i]);
    }
    while(r-l>=0.0000001){
        double mid=(l+r)/2;
        if(check(mid)==true){//此时的mid合法
            l=mid;
        }
        else{
            r=mid;
        }
    }
    if(r==1e10){
        printf("-1\n");//可以无限使用
    } else {
        cout << r;
    }
    return 0;
}