为什么 会死循环
查看原帖
为什么 会死循环
892284
EAZINZERO楼主2023/7/15 12:41
#include <iostream>
#include <algorithm>
#include <cstdio>

using namespace std;
const int maxx = 1e5 + 10;
double n,p;
typedef struct facility{
    double a,b,t;
}Fa;
Fa fa[maxx];
bool Find(double x){
    //枚举 每个最长时间
    double energe = x * p, nee = 0;   //充电器 可以充的总能量
    for(int i = 1;i <= n;i++){
        if(fa[i].b < fa[i].a * x)   //如果 这个时间内 设备需要充电
        nee += fa[i].a * x - fa[i].b;   //每个设备 在 x时间内 需要的能量
    }
    //如果 所需要的能量 小于 mid就继续往大 的找
    return nee <= energe;
}
int main()
{
    cin >> n >> p;    //每秒可以 充能 p 个单位
    long long sum = 0;
    for(int i = 1;i <= n;i++){
        cin >> fa[i].a >> fa[i].b;  //每个设备 消耗的能量
                                    //每个设备 刚开始的能量
        sum += fa[i].a;             //消耗能量的总速度
    }
    if(p >=sum){
        cout << -1.0000000000;
        return 0;
    }
    //求 第一个设备 能量降为 0 的时间最长是 多久
    double l = 0,r = 1e10,ans = 0;
    //mid 是 最长使用时间的最大值
    while(r - l > 1e-6){
        double mid = (l + r)/2;
        if(Find(mid)) ans = l,l = mid;
        else r = mid + 1e-6 ;
    }
    printf("%.10lf",r);
    return 0;
}

如果 r = mid 就可以AC

    double l = 0,r = 1e10,ans = 0;
    //mid 是 最长使用时间的最大值
    while(r - l > 1e-6){
        double mid = (l + r)/2;
        if(Find(mid)) ans = l,l = mid;
        else r = mid ;
    }


为什么啊……T^T

是因为 “ (r - l) > 1e-6 整数常量上存在无效后缀 ”吗?

2023/7/15 12:41
加载中...