import
java.util.Arrays;
public
class
Main {
static
double
getMinSubarraySum(
double
[] arr,
int
N) {
double
sum =
0
, ans = arr[
0
];
for
(
int
i =
0
; i < N; i++) {
sum += arr[i];
ans = Math.min(ans, sum);
if
(sum >
0
)
sum =
0
;
}
return
ans;
}
static
double
getMaxSubarraySum(
double
[] arr,
int
N) {
double
sum =
0
, ans = arr[
0
];
for
(
int
i =
0
; i < N; i++) {
sum += arr[i];
ans = Math.max(ans, sum);
if
(sum <
0
)
sum =
0
;
}
return
ans;
}
static
double
solve(
double
[] arr,
int
N,
double
X) {
for
(
int
i =
0
; i < N; i++)
arr[i] -= X;
double
ans = Math.max(Math.abs(getMaxSubarraySum(arr, N)),
Math.abs(getMinSubarraySum(arr, N)));
for
(
int
i =
0
; i < N; i++)
arr[i] += X;
return
ans;
}
public
static
void
main(String[] args) {
int
N =
3
;
double
[] arr = {
1
,
2
,
3
};
int
cnt =
200
;
double
lo = -1e4, hi = 1e4;
while
(cnt-- >
0
) {
double
mid1 = lo + (hi - lo) /
3.0
;
double
mid2 = hi - (hi - lo) /
3.0
;
double
val1 = solve(Arrays.copyOf(arr, N), N, mid1);
double
val2 = solve(Arrays.copyOf(arr, N), N, mid2);
if
(val1 == val2) {
lo = mid1;
hi = mid2;
}
else
if
(val1 < val2) {
hi = mid2;
}
else
{
lo = mid1;
}
}
System.out.printf(
"%.6f%n"
, solve(arr, N, lo));
}
}