#include<bits/stdc++.h>
using namespace std;
typedef double db;
const int N = 1e5 + 5;
int n, m, k;
db ans = 0;
db a[N];
db b[N];
bool vis[N];
int main() {
	cin >> n >> m >> k;
	for (int i = 1; i <= k; ++i) {
		int t;
		cin >> t;
		vis[n-t] = 1;
	}
	db ans1 = 0, ans2 = 0;
	for (int i = 1; i <= n; ++i) {
		if (vis[i]) {
			a[i] = 1, b[i] = 0;
		}
		else {
			a[i] = ans1 / m;
			b[i] = ans2 / m + 1;
		}
		ans1 += a[i], ans2 += b[i];
		if (i >= m) {
			ans1 -= a[i - m];
			ans2 -= b[i - m];
		}
	}
	if (abs(a[n] - 1.0) < 1e-6)puts("-1");
	else printf("%.4lf\n", b[n] / (1.0 - a[n]));
	
}
#include <bits/stdc++.h>
using ll = long long;
using namespace std;
#define rep(i, n) for (int i = 0, i##_len = (int)(n); i < i##_len; i++)
#define reps(i, n) for (int i = 1, i##_len = (int)(n); i <= i##_len; i++)
#define rrep(i, n) for (int i = ((int)(n)-1); i >= 0; i--)
#define rreps(i, n) for (int i = ((int)(n)); i > 0; i--)
#define repi(i, x) \
	for (auto i = (x).begin(), i##_fin = (x).end(); i != i##_fin; i++)
#define all(x) (x).begin(), (x).end()
#define F first
#define S second
#define mp make_pair
#define mt make_tuple
#define pb push_back
#define eb emplace_back
typedef vector<int> Vi;
typedef vector<Vi> VVi;
typedef pair<int, int> Pi;
typedef vector<Pi> VPi;
typedef vector<long long> V;
typedef vector<V> VV;
typedef vector<VPi> VVPi;
typedef pair<long long, long long> P;
typedef vector<P> VP;
template <class T>
inline bool chmax(T& a, T b) {
	if (a < b) {
		a = b;
		return 1;
	}
	return 0;
}
template <class T>
inline bool chmin(T& a, T b) {
	if (a > b) {
		a = b;
		return 1;
	}
	return 0;
}
template <class T>
inline bool chmin(pair<T, T>& a, pair<T, T> b) {
	if (max(a.F, a.S) > max(b.F, b.S)) {
		a = b;
		return 1;
	}
	return 0;
}
template <class T, class U>
ostream& operator<<(ostream& os, const pair<T, U>& p) {
	os << "(" << p.first << " " << p.second << ")";
	return os;
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
#ifdef LOCAL
	os << "{";
#endif
	rep(i, v.size()) {
		if (i) os << " ";
		os << v[i];
	}
#ifdef LOCAL
	os << "}";
#endif
	return os;
}
template <class T, class U>
istream& operator>>(istream& is, pair<T, U>& p) {
	is >> p.first >> p.second;
	return is;
}
template <class T>
istream& operator>>(istream& is, vector<T>& v) {
	rep(i, v.size()) { is >> v[i]; }
	return is;
}
const long long INFLL = 1LL << 60;
const int INF         = 1 << 30;
const double PI       = acos(-1);
#ifdef LOCAL
#define dbg(x) cerr << #x << ": " << (x) << '\n'
#define say(x) cerr << (x) << '\n'
#else
#define dbg(x)
#define say(x)
#endif
void init_main() {
	cin.tie(nullptr);
	ios::sync_with_stdio(false);
#ifdef LOCAL
	if (freopen("in.txt", "r", stdin) == NULL) {
		cerr << "no inputfile found" << '\n';
	}
	if (freopen("out.txt", "w", stdout) == NULL) {
		cerr << "no outputfile found" << '\n';
	}
	if (freopen("err.txt", "w", stderr) == NULL) {
		cerr << "no errputfile found" << '\n';
	}
#endif
}
string solve(bool a) { return ((a) ? "Yes" : "No"); }

int main() {
	init_main();
	int n;
	int ans = INF;
	cin >> n;
	Vi t(n);
	cin >> t;
	int sum = 0;
	rep(i, n) { sum += t[i]; }
	VVi dp(n + 1, Vi(sum / 2 + 5, 0));
	dp[0][0] = 1;
	rep(i, n) {
		rep(j, sum / 2 + 2) {
			if (dp[i][j]) {
				dp[i + 1][j] = 1;
				if (j + t[i] < sum / 2 + 1) {
					dp[i + 1][j + t[i]] = 1;
				}
			}
		}
	}
	dbg(dp);
	rep(i, sum / 2 + 3) {
		if (dp[n][i]) chmin(ans, max(i, sum - i));
	}
	cout << ans << endl;
}
/*
n^2 -> nT
dp[at][flag]->(a,b)
*/