#include <bits/stdc++.h>
using namespace std;
const int M = 2005;
double dp[2][2][M][M], p0, p1;
bool has[2][2][M][M];
int n, pos[M], h;
double dfs(int f1, int f2, int l, int r) {
  if (l > r) return 0;
  int x = pos[l - 1] + (f1 ? h : 0), y = pos[r + 1] - (f2 ? 0 : h);
  double &ans = dp[f1][f2][l][r];
  if (has[f1][f2][l][r]) return ans;
  has[f1][f2][l][r] = 1;
  ans = 0;
  double A, B, C, D;
  int res = y - x;
  if (res < 0) res = 0;
  if (f1 && h > pos[l] - pos[l - 1])
    return ans = dfs(f1, f2, l + 1, r) + min(pos[l] - pos[l - 1], res);
  if (!f2 && h > pos[r + 1] - pos[r])
    return ans = dfs(f1, f2, l, r - 1) + min(pos[r + 1] - pos[r], res);
  A = dfs(f1, 0, l, r - 1) + min(h, max(pos[r] - x, 0));
  B = dfs(1, f2, l + 1, r) + min(h, max(y - pos[l], 0));
  C = dfs(0, f2, l + 1, r) + min(h, pos[l] - x);
  D = dfs(f1, 1, l, r - 1) + min(h, y - pos[r]);
  ans = p1 * (B + D) + p0 * (A + C);
  return ans *= 0.5;
}
int main() {
  cin >> n >> h >> p0;
  p1 = 1.0 - p0;
  pos[0] = -2e8, pos[n + 1] = 2e8;
  for (int i = 1; i <= n; i++) scanf("%d", pos + i);
  sort(pos + 1, pos + 1 + n);
  printf("%.9f", dfs(0, 1, 1, n));
}
