题意:
给你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;
}

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

265

被折叠的 条评论
为什么被折叠?



