比赛的时候没看这个题,其实很简单,两次二分即可求出答案。
#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=100005;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
double a[maxn];
ll n,f;
bool check1(double m)
{
double t=m*f;
double b[maxn];
memset(b,0,sizeof(0));
for(int i=0;i<n;i++)
{
b[i]=t;
}
for(int i=0;i<n-1;i++)
{
if(b[i]>a[i])
{
b[i+1]+=(b[i]-a[i]);
b[i]=a[i];
}
}
/* for(int i=0;i<n;i++)
{cout<<b[i]<<endl;}*/
if(b[n-1]>=a[n-1])
{
return true;
}
return false;
}
bool check2(double m)
{
double t=m*f;
double b[maxn];
memset(b,0,sizeof(0));
for(int i=0;i<n;i++)
{
b[i]=t;
}
for(int i=0;i<n-1;i++)
{
if(b[i]>a[i])
{
b[i+1]+=(b[i]-a[i]);
b[i]=a[i];
}
}
for(int i=0;i<n;i++)
{
if(b[i]<a[i])
return false;
}
return true;
}
int main()
{
while(~scanf("%lld %lld",&n,&f))
{
for(int i=0;i<n;i++)
{
scanf("%lf",&a[i]);
}
double l=0,r=1000000000;
double ans1=1,ans2=1;
for(int i=0;i<70;i++)
{
double m=(l+r)/2;
// cout<<m<<endl;
if(check1(m))
{
r=m;
ans1=m;
}
else
{
l=m;
}
}
l=0,r=1000000000;
for(int i=0;i<70;i++)
{
double m=(l+r)/2;
// cout<<m<<endl;
if(check2(m))
{
r=m;
ans2=m;
}
else
{
l=m;
}
}
printf("%.8lf %.8lf\n",ans1,ans2);
}
return 0;
}