#include <bits/stdc++.h>
using namespace std;
int n, h;
double p, answer = 0;
vector<int> x;
vector<int> LenFallToLeft, LenFallToRight;
vector<int> CntFallToLeft, CntFallToRight;
const int maxN = 2007;
double D[maxN][maxN][2][2];
void calc(int left, int right, int lout, int rout) {
  double curP = D[left][right][lout][rout];
  double fallL2L = left ? min(h, x[left] - x[left - 1]) : h;
  double fallR2R = right ? min(h, x[n - right] - x[n - 1 - right]) : h;
  double fallL2LwithErr = left ? min(h, max(0, x[left] - x[left - 1] - h)) : h;
  double fallR2RwithErr =
      right ? min(h, max(0, x[n - right] - x[n - 1 - right] - h)) : h;
  if (lout)
    answer += curP / 2 * p * fallL2L;
  else
    answer += curP / 2 * p * fallL2LwithErr;
  if (rout)
    answer +=
        curP / 2 * (1 - p) *
        min(double(LenFallToRight[left]), x[n - 1 - right] - x[left] + fallR2R);
  else
    answer += curP / 2 * (1 - p) *
              min(double(LenFallToRight[left]),
                  x[n - 1 - right] - x[left] + fallR2RwithErr);
  if (rout)
    answer += curP / 2 * (1 - p) * fallR2R;
  else
    answer += curP / 2 * (1 - p) * fallR2RwithErr;
  if (lout)
    answer +=
        curP / 2 * p *
        min(double(LenFallToLeft[right]), x[n - 1 - right] - x[left] + fallL2L);
  else
    answer += curP / 2 * p *
              min(double(LenFallToLeft[right]),
                  x[n - 1 - right] - x[left] + fallL2LwithErr);
  D[left + 1][right][1][rout] += curP / 2 * p;
  D[left][right + 1][lout][1] += curP / 2 * (1 - p);
  int newLeft = left + CntFallToRight[left];
  int newRight = right + CntFallToLeft[right];
  D[newLeft][right][0][rout] += curP / 2 * (1 - p);
  D[left][newRight][lout][0] += curP / 2 * p;
}
int main() {
  cin >> n >> h;
  cin >> p;
  x = vector<int>(n);
  for (int i = 0; i < n; ++i) cin >> x[i];
  sort(x.begin(), x.end());
  LenFallToLeft = LenFallToRight = CntFallToLeft = CntFallToRight =
      vector<int>(n);
  for (int i = 0; i < n; ++i) {
    CntFallToRight[i] = CntFallToLeft[n - 1 - i] = 1;
    LenFallToRight[i] = h;
    for (int j = i + 1; j < n; ++j) {
      if (x[j] - x[i] < LenFallToRight[i]) {
        LenFallToRight[i] = x[j] - x[i] + h;
        CntFallToRight[i]++;
      }
    }
    LenFallToLeft[n - 1 - i] = h;
    for (int j = i - 1; j >= 0; --j) {
      if (x[i] - x[j] < LenFallToLeft[n - 1 - i]) {
        LenFallToLeft[n - 1 - i] = x[i] - x[j] + h;
        CntFallToLeft[n - 1 - i]++;
      }
    }
  }
  D[0][0][0][0] = 1;
  calc(0, 0, 0, 0);
  for (int len = n - 1; len >= 1; --len)
    for (int left = 0; left + len <= n; ++left)
      for (int i = 0; i < 2; ++i)
        for (int j = 0; j < 2; ++j) calc(left, n - left - len, i, j);
  printf("%.10lf", answer);
  return 0;
}
