#include <bits/stdc++.h>
using namespace std;
 
int main(){
  int N,D,H;
  cin >> N >> D >> H;
  
  vector <float> dnum(N);
  vector <float> hnum(N);
  for(int i=0;i<N;i++){
    cin >> dnum[i] >> hnum[i];
  }
  float lean = 1000;
  for(int i=0;i<N;i++){
    hnum[i] = H-hnum[i];
    dnum[i] = D-dnum[i];
    if((hnum[i]/dnum[i]) < lean)
      lean = hnum[i]/dnum[i];
  }
  float b = 0;
  b = H - lean*D;
  if(b < 0)
    b = 0;
  cout << b << endl;
}
#include <bits/stdc++.h>
#define rep(i, n) for(int(i) = 0; (i) < (n); (i)++)
#define FOR(i, m, n) for(int(i) = (m); (i) < (n); (i)++)
#define ALL(v) (v).begin(), (v).end()
#define LLA(v) (v).rbegin(), (v).rend()
#define SZ(v) (v).size()
#define INT(...)                                                               \
    int __VA_ARGS__;                                                           \
    read(__VA_ARGS__)
#define LL(...)                                                                \
    ll __VA_ARGS__;                                                            \
    read(__VA_ARGS__)
#define DOUBLE(...)                                                            \
    double __VA_ARGS__;                                                        \
    read(__VA_ARGS__)
#define CHAR(...)                                                              \
    char __VA_ARGS__;                                                          \
    read(__VA_ARGS__)
#define STRING(...)                                                            \
    string __VA_ARGS__;                                                        \
    read(__VA_ARGS__)
#define VEC(type, name, size)                                                  \
    vector<type> name(size);                                                   \
    read(name)
using namespace std;
using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using Graph = vector<vector<int>>;
template <typename T> struct edge {
    int to;
    T cost;
    edge(int t, T c) : to(t), cost(c) {}
};
template <typename T> using WGraph = vector<vector<edge<T>>>;
const int INF = 1 << 30;
const ll LINF = 1LL << 60;
const int MOD = 1e9 + 7;
template <class T> inline vector<T> make_vec(size_t a, T val) {
    return vector<T>(a, val);
}
template <class... Ts> inline auto make_vec(size_t a, Ts... ts) {
    return vector<decltype(make_vec(ts...))>(a, make_vec(ts...));
}

void read() {}
template <class T> inline void read(T &a) { cin >> a; }
template <class T, class S> inline void read(pair<T, S> &p) {
    read(p.first), read(p.second);
}
template <class T> inline void read(vector<T> &v) {
    for(auto &a : v)
        read(a);
}
template <class Head, class... Tail>
inline void read(Head &head, Tail &...tail) {
    read(head), read(tail...);
}
template <class T> inline void chmax(T &a, T b) { (a < b ? a = b : a); }
template <class T> inline void chmin(T &a, T b) { (a > b ? a = b : a); }

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    INT(n, m, k);
    VEC(int, a, k);
    vector<bool> trap(n + 1);
    rep(i, k) { trap[a[i]] = 1; }
    int len = 0;
    rep(i, n + 1) {
        if(trap[i] == 1)
            len++;
        else {
            len = 0;
        }
        if(len >= m) {
            cout << -1 << endl;
            return 0;
        }
    }
    auto dp = make_vec(n + 1, make_pair(0.0, 0.0));
    dp[n] = {0, 0};
    double x = 0, y = 0;
    for(int i = n - 1; i >= 0; i--) {
        if(!trap[i])
            dp[i] = {x / m, y / m + 1};
        else
            dp[i] = {1, 0};

        x += dp[i].first;
        y += dp[i].second;

        if(i + m <= n) {
            x -= dp[i + m].first;
            y -= dp[i + m].second;
        }
    }
    double b = dp[0].first, c = dp[0].second;
    cout << fixed << setprecision(10) << c / (1 - b) << endl;
}