cf 801c Voltage Keepsake

本文通过二分枚举法解决了一道关于多个装置在有限充电条件下维持工作的最长时间问题。通过对装置耗电量和储存电量的分析,实现了算法的有效求解。


题意:

给你n个装置,每个装置每分钟耗电p  ,本身储存电c。

然后你有一个充电器,(随时充,转移不耗时,想怎么换着充都行)。

问你让所有装置都能保持工作的最大时间是多少。


题解: 

二分枚举最长时间:


我写的时候因为粗心,被hink了,睡的早,每发现, 其中遇见了两个问题,第一,R的上限,我开到了1e9,  当时没仔细想,最后换成1e18;

第二个问题,储存所有装置的P的和的变量S 我用的 int 。。s超界导致出现出现-1.

写题太粗心。


#include<bits/stdc++.h>

using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 111115;
int n, m;
struct node{
    int p,c;
    double t;
}a[maxn];
int main() {
    scanf("%d %d",&n,&m);
    long long sum=0;
    for(int i=1;i<=n;++i){
        scanf("%d %d",&a[i].p,&a[i].c);
        a[i].t=a[i].c*1.0/a[i].p;
        sum+=a[i].p;
    }
    if(m>=sum) {printf("-1\n");return 0;}
    double l=0.0000001,r=1e18;
    while(r-l>=0.0000001){
        double mid=(l+r)/2;
        double s=0;
        for(int i=1;i<=n;++i){
            if(a[i].t<mid) s+=(mid-a[i].t)*a[i].p;
        }
        if(s>m*mid) r=mid-0.0000001;
        else l=mid+0.0000001;
    }
    printf("%lf",l);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值