#include <bits/stdc++.h>
using namespace std;
int n[3];
int nf, ne, ns, d[2];
int R[3];
char M[100];
pair<double, int> I[100];
double tempo[100], ANS;
char qnt[100];
int v[100];
double raio[3];
int topo;
inline void faz() {
  topo = 0;
  for (int i = 0; i < 13; i++) {
    for (int j = 0; j < M[i]; j++) {
      I[topo++] = make_pair((double)i - raio[2], 1);
      I[topo++] = make_pair((double)i + raio[2], -1);
    }
  }
  sort(I, I + topo);
  for (int i = 0; i < topo; i++) {
    tempo[i] = I[i].first;
    if (i == 0)
      qnt[i] = 1;
    else
      qnt[i] = qnt[i - 1] + I[i].second;
  }
}
inline double resolve(int pos, int tipo) {
  double ini = ((double)pos - raio[tipo]);
  double fim = ((double)pos + raio[tipo]);
  if (abs(ini - fim) < 1e-9) return 0.;
  double ret = 0;
  if (topo == 0 || fim - 1e-9 < tempo[0] || ini > tempo[topo - 1] - 1e-9) {
    return d[tipo] * (fim - ini);
  }
  for (int i = 0; i < topo - 1; i++) {
    double a = tempo[i], b = tempo[i + 1];
    double x = qnt[i] + 1;
    if (a < ini + 1e-9 && b + 1e-9 > fim)
      ret += (fim - ini) * (x);
    else if (a > ini - 1e-9 && b - 1e-9 < fim)
      ret += (b - a) * (x);
    else if (fim > a - 1e-9 && fim - 1e-9 < b)
      ret += (fim - a) * (x);
    else if (ini < b + 1e-9 && ini + 1e-9 > a)
      ret += (b - ini) * (x);
  }
  if (ini - 1e-9 < tempo[0] && fim > tempo[0] - 1e-9) ret += (tempo[0] - ini);
  if (fim + 1e-9 > tempo[topo - 1] && ini - 1e-9 < tempo[topo - 1])
    ret += (fim - tempo[topo - 1]);
  return d[tipo] * ret;
}
double pd[100][100][100];
int ja[100][100][100];
int Time;
pair<double, double> dam[100];
double solve(int pos, int fire, int ele) {
  if (fire < 0 || ele < 0) return -1e9;
  if (fire + ele == 0) return 0;
  if (pos == 13) return -1e9;
  if (ja[pos][fire][ele] == Time) return pd[pos][fire][ele];
  ja[pos][fire][ele] = Time;
  double& ret = pd[pos][fire][ele];
  ret = solve(pos + 1, fire, ele);
  int falta = 2 - M[pos];
  if (falta >= 1) {
    ret = max(ret, dam[pos].first + solve(pos + 1, fire - 1, ele));
    ret = max(ret, dam[pos].second + solve(pos + 1, fire, ele - 1));
  }
  if (falta >= 2) {
    ret = max(ret,
              dam[pos].first + dam[pos].first + solve(pos + 1, fire - 2, ele));
    ret = max(
        ret, dam[pos].second + dam[pos].second + solve(pos + 1, fire, ele - 2));
    ret = max(ret, dam[pos].first + dam[pos].second +
                       solve(pos + 1, fire - 1, ele - 1));
  }
  return ret;
}
inline double calcula() {
  faz();
  for (int i = 0; i < 13; i++) dam[i] = make_pair(resolve(i, 0), resolve(i, 1));
  Time++;
  return solve(0, n[0], n[1]);
}
void gera(int c, int falta) {
  if (c >= 13 || falta < 0) return;
  if (falta == 0) {
    ANS = max(ANS, calcula());
    return;
  }
  M[c] = 0;
  gera(c + 1, falta);
  M[c] = 1;
  gera(c + 1, falta - 1);
  M[c] = 2;
  gera(c + 1, falta - 2);
  M[c] = 0;
}
int main() {
  for (int i = 0; i < 3; i++) cin >> n[i];
  for (int i = 0; i < 3; i++) cin >> R[i];
  for (int i = 0; i < 3; i++) raio[i] = sqrt((R[i]) * (R[i]) - 1);
  for (int i = 0; i < 2; i++) cin >> d[i];
  memset(M, 0, sizeof M);
  memset(ja, -1, sizeof ja);
  Time = 0;
  ANS = 0;
  gera(0, n[2]);
  printf("%.10f\n", ANS);
  return 0;
}
