这个题可以直接二分答案来验证这个时间能不能满足题意
验证时要注意一点,后面的多出来的水不能去弥补前面缺少的水
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
using namespace std;
const int N=100000+3;
double f;
int n;
double c[N];
double J1(double t)
{
double ans[n+1],pre=0;//pre表示前面多出来的水
for(int i=1; i<=n; i++) ans[i]=t*f;//初始化t时书龙头出来的水
for(int i=1; i<=n; i++)
{
ans[i]+=pre;
pre=0;
if(ans[i]>c[i]) pre=ans[i]-c[i];
}
for(int i=1; i<=n; i++)
if(ans[i]<c[i])
return false;//如果存在t时有不满的
return true ;
}
double J2(double t)
{
double ans[n+1],pre=0;
for(int i=1; i<=n; i++) ans[i]=t*f;
for(int i=1; i<=n; i++)
{
ans[i]+=pre;
pre=0;
if(ans[i]>c[i]) pre=ans[i]-c[i];
}
if(ans[n]<c[n]) return false;//二分最后一个满的时间时只需要比较最后是否满
return true ;
}
int main()
{
while(scanf("%d%lf",&n,&f)!=EOF)
{
for(int i=1; i<=n; i++)
scanf("%lf",&c[i]);
double l=0,r=1000000000,mid;
while(l<r)
{
mid=(l+r)/2;
if(J2(mid)<=0) l=mid+0.0000001;
else r=mid-0.0000001;
}
printf("%.6lf ",mid);
l=0,r=1000000000;
while(l<r)
{
mid=(l+r)/2;
if(J1(mid)<=0) l=mid+0.0000001;
else r=mid-0.0000001;
}
printf("%.6lf\n",mid);
}
return 0;
}