This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
using namespace std;
//ifstream fin("seesaw.in");
//#define cin fin
#define double long double
vector<double> ord;
int n;
int a[200005];
double tot,ans=1000000000;
double verif(double le)///lungimea minima daca barycentrul nu poate trece in stanga lui le
{
double sum = tot,mxm;
int pozs=1,pozd=n;
//mxm = tot/n;
mxm = tot/n;
for(int i=1;i<=n-1;i++)
{
if((sum-a[pozd])/(n-i)>=le)
{
sum-=a[pozd];
pozd--;
}
else
{
sum-=a[pozs];
pozs++;
}
mxm = max(mxm, sum/(n-i));
//cout<<fixed<<setprecision(15)<<sum/(n-i)<<"\n";
}
ans = min(ans, mxm-le);
return mxm-le;
}
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
tot+=a[i];
}
for(int i=1;i<=n;i++)
{
double cv = 0;
for(int j=i;j<=n;j++)
{
cv += a[j];
ord.push_back(cv/(j-i+1));
}
}
sort(ord.begin(),ord.end());
while(ord[ord.size()-1]>tot/n)
ord.pop_back();
int st,dr,mij1,mij2;
st=0;
dr=ord.size()-1;
while(dr-st+1>=1000)
{
mij1 = st + (dr-st+1)/3;
mij2 = mij1 + (dr-st+1)/3;
if(verif(ord[mij1])==verif(ord[mij2]))
{
while(1)
st=dr;
}
if(verif(ord[mij1])<verif(ord[mij2]))
dr=mij2;
else
st=mij1;
}
//st=0;dr=ord.size()-1;
for(int i=st;i<=dr;i++)
ans = min(ans, verif(ord[i]));
cout<<fixed<<setprecision(15)<<ans;
return 0;
}
/**
*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |