CF578C:Weakness and Poorness——题解

时间:2025-01-14 13:34:26

https://vjudge.net/problem/CodeForces-578C

——————————————————————————

题目大意:序列的数-x,求最大连续子序列和的绝对值的最小值。

————————————————————————————

没有绝对值的话,明显是单调增的。

将数全部翻转,明显是单调减的。

所以显然是单峰函数,可以三分x做。

要注意精度,循环200就差不多了,不要循环太多次不然会TLE。

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
using namespace std;
const int M=;
double a[M];
int n;
double suan(double m){
double ans=,sum=;
for(int i=;i<=n;i++){
sum+=a[i]-m;
if(sum<)sum=;
ans=max(ans,sum);
}
sum=;
for(int i=;i<=n;i++){
sum+=m-a[i];
if(sum<)sum=;
ans=max(ans,sum);
}
return ans;
}
double sanfen(double l,double r){
for(int i=;i<=;i++){
double midl=(r-l)/+l;
double midr=r-(r-l)/;
if(suan(midl)<suan(midr))r=midr;
else l=midl;
}
return l;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%lf",&a[i]);
printf("%.15lf\n",suan(sanfen(-,)));
return ;
}