CodeForces - 801C Voltage Keepsake(二分)

题目链接:点击查看

题目大意:给出n个电器,每个电器每秒钟都需要消耗一定的能量,每个电器初始时储存了一定的能量,现在有一个充电器,可以给任意一个电器充电,问这n个电器最多能运行多久

题目分析:看到这个题目我们可以二分电器运行的时间,但一开始我不太会写判断条件,去网上搜了一下之后才知道该怎么做的。。还是得多做点题才能解锁更多的做题姿势

简单说一下,这个题目是个浮点数的二分题目,然后我们每次二分的mid的意义在这个题目中代表了运行时间,那么我们就可以枚举每个电器,计算一下该电器运行到目前为止所需要消耗的能量,如果该能量比其储存的能量小,那么可以直接跳过,如果该能量比其储存的能量要大,那么就需要充电器进行充电,计算一下充电器需要在该电器上冲多久的电,最后用充电器所需要充电的时间和当前时间比较一下就能表示check函数了

代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include 
using namespace std;

typedef long long LL;

const int inf=0x3f3f3f3f;

const int N=1e5+100;

const double eps=1e-6;

int cost[N],power[N];

int main()
{
//  freopen("input.txt","r",stdin);
    int n,p;
    scanf("%d%d",&n,&p);
    LL sum=0;
    for(int i=1;i<=n;i++)
    {
    	scanf("%d%d",cost+i,power+i);
    	sum+=cost[i];
	}
	if(sum<=p)
		return 0*printf("-1\n");
	double l=0,r=1e18;
	while(fabs(l-r)>eps)
	{
		double mid=(l+r)*0.5;//能坚持多久 
		double cnt=0;
		for(int i=1;i<=n;i++)
			if(mid*cost[i]>power[i])
				cnt+=(mid*cost[i]-power[i])/p;//计算所需要的充电时间 
		if(cnt>mid)
			r=mid;
		else
			l=mid;
	}
	printf("%.5f\n",l);
    
    

    
    
    
    
    
    
    
    
    
    

    return 0;
}

 

你可能感兴趣的:(二分)