#include <cstdio>
#include <vector>
using namespace std;

typedef long long LL;

const int N = 1000005;

struct Point {
	LL x, y;
	Point() {}
	Point(LL x, LL y) : x(x), y(y) {}
};

const Point operator-(const Point& a, const Point& b) {
	return Point(a.x-b.x, a.y-b.y);
}

LL operator*(const Point& a, const Point& b) {
	return a.x*b.y-b.x*a.y;
}

int n;
Point a[N], b[N];

int main() {
	scanf("%d", &n);
	for(int c, i = 0; i < n; ++i) {
		scanf("%d", &c);
		a[i].y = c, a[i].x = i;
		b[i].y = c, b[i].x = i+1;
	}
	vector<Point> u, d;
	for(int i = n-1; i >= 0; --i) {
		while(u.size() > 1) {
			int k = u.size();
			if((u[k-1]-u[k-2])*(a[i]-u[k-2]) >= 0) {
				u.pop_back();
			} else break;
		}
		u.push_back(a[i]);
	}
	for(int i = 0; i < n; ++i) {
		while(d.size() > 1) {
			int k = d.size();
			if((d[k-1]-d[k-2])*(b[i]-d[k-2]) >= 0) {
				d.pop_back();
			} else break;
		}
		d.push_back(b[i]);
	}
	int i = 0, j = 0;
	while(1) {
		bool ok = true;
		if(i+1 < (int)u.size() && (u[i+1]-u[i])*(d[j]-u[i]) < 0) {
			ok = false;
			++i;
		}
		if(j+1 < (int)d.size() && (d[j+1]-d[j])*(u[i]-d[j]) < 0) {
			ok = false;
			++j;
		}
		if(ok) break;
	}
	Point p = u[i]-d[j];
	double max = 1.0*p.y/p.x;
	i = u.size()-1, j = d.size()-1;
	while(1) {
		bool ok = true;
		if(i-1 >= 0 && (u[i-1]-u[i])*(d[j]-u[i]) > 0) {
			ok = false;
			--i;
		}
		if(j-1 >= 0 && (d[j-1]-d[j])*(u[i]-d[j]) > 0) {
			ok = false;
			--j;
		}
		if(ok) break;
	}
	p = d[j]-u[i];
	double min = 1.0*p.y/p.x;
	printf("%.15f %.15f\n", min, max);
}
