#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
typedef long double ld;
const int INF = 1e9;
const ll LINF = 1e18;
const ld eps = 1e-3;
const int N = 1e5 + 5;
int n;
int a[N];
// Giả sử ta cần check giá trị trung bình cộng là avg (average)
// Xét một cách chọn bất kì thoả mãn yêu cầu {i1, i2, ..., in}
// Ta có: (a[i1] + a[i2] + ... + a[in]) / n >= avg
// <=> a[i1] + a[i2] + ... + a[in] >= n * avg
// <=> a[i1] + a[i2] + ... + a[in] - n * avg >= 0
// <=> (a[i1] - avg) + (a[i2] - avg) + ... + (a[in] - avg) >= 0
// Từ đây ta có thể đặt mảng b với b[i] = (a[i] - avg), việc còn lại là check max_sum(b) >= 0
// Với giá trị avg càng lớn thì giá trị b[i] càng nhỏ
// giá trị avg càng nhỏ thì giá trị b[i] càng lớn
// => Tìm kiếm nhị phân đáp án
ld f[N]; // f[i] = Tổng lớn nhất thoả mãn điều kiện tính đến vị trí thứ i
bool checkAvg(ld avg) {
f[0] = 0;
f[1] = a[1] - avg;
for (int i = 2; i <= n; i++) {
ld x = a[i] - avg;
f[i] = x + max(f[i - 1], f[i - 2]);
}
return (max(f[n], f[n - 1]) + eps >= 0);
}
ld maxAvg() {
ld l = 1, r = 1e9, ans = -1;
while (l - eps <= r) {
ld mid = (l + r) / 2;
if (checkAvg(mid)) {
ans = mid;
l = mid + eps;
}
else {
r = mid - eps;
}
}
return ans;
}
// Với med thì các em có thể xem lại ý tưởng ở bài D. Max Median (Codeforces)
int dp[N]; // dp[i] = Tổng lớn nhất thoả mãn điều kiện tính đến vị trí thứ i
bool checkMed(int med) {
dp[0] = 0;
dp[1] = (a[1] >= med) ? 1 : -1;
for (int i = 2; i <= n; i++) {
int x = (a[i] >= med) ? 1 : -1;
dp[i] = x + max(dp[i - 1], dp[i - 2]);
}
return (max(dp[n], dp[n - 1]) > 0);
}
int maxMedian() {
int l = 1, r = 1e9, ans = -1;
while (l <= r) {
int mid = (l + r) >> 1;
if (checkMed(mid)) {
ans = mid;
l = mid + 1;
}
else {
r = mid - 1;
}
}
return ans;
}
int main() {
ios::sync_with_stdio(0); cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
cout << fixed << setprecision(17) << maxAvg() << '\n';
cout << maxMedian() << '\n';
}