Codeforces GYM305690 G. Ice Cream 题解

151 阅读1分钟

题目链接

思路

二分时间。对于时间titi,在这期间要一刻不停的吃,因此将所有冰激凌减去融化的部分后,检查把剩下的部分全部吃完需要多长时间。

代码

#include<bits/stdc++.h>
#define rep(i,st,ed) for(int i=st;i<=ed;++i)
using namespace std;
const int N=3e5+10;
int n;
double v,u;
double a[N];
bool check(double ti)
{
	double t=ti;
	rep(i,1,n)
	{
		double res=a[i]-v*ti;
		if(res>0)
			t-=res/u;
	}
	return t>=0;
}
int main()
{
	scanf("%d %lf %lf",&n,&v,&u);
	rep(i,1,n)
		scanf("%lf",a+i);
	double l=0,r=1e9;
	rep(i,1,100)
	{
		double mid=(l+r)/2;
		if(check(mid))
			r=mid;
		else
			l=mid;
	}
	printf("%.6lf\n",(l+r)/2*u);
}