#include <bits/stdc++.h>
using namespace std;
int N1, N2, N3, N;
double RNG1, RNG2, RNG3;
double ATK1, ATK2;
double pos[21];
bool isFreeze[21];
double answer = 0;
double posFreeze[21];
double cross(double L1, double R1, double L2, double R2) {
  double L = max(L1, L2);
  double R = min(R1, R2);
  return max(0.0, R - L);
}
double calcTower1(double p) {
  double r = 2 * RNG1;
  for (int i = 1; i <= N3; i++)
    r += cross(p - RNG1, p + RNG1, posFreeze[i] - RNG3, posFreeze[i] + RNG3);
  return r * ATK1;
}
double calcTower2(double p) {
  double r = 2 * RNG2;
  for (int i = 1; i <= N3; i++)
    r += cross(p - RNG2, p + RNG2, posFreeze[i] - RNG3, posFreeze[i] + RNG3);
  return r * ATK2;
}
void solve() {
  int z = 0;
  for (int i = 1; i <= N; i++)
    if (isFreeze[i]) posFreeze[++z] = pos[i];
  vector<double> becomeTower2;
  double ret = 0;
  for (int i = 1; i <= N; i++)
    if (!isFreeze[i]) {
      double T1 = calcTower1(pos[i]);
      double T2 = calcTower2(pos[i]);
      ret += T1;
      becomeTower2.push_back(T2 - T1);
    }
  sort(becomeTower2.begin(), becomeTower2.end());
  for (int i = N1; i < N1 + N2; i++) ret += becomeTower2[i];
  answer = max(answer, ret);
}
void dfs(int cur, int cnt) {
  if (cnt > N3) return;
  if (cur == N + 1) {
    if (cnt < N3) return;
    solve();
    return;
  }
  isFreeze[cur] = false;
  dfs(cur + 1, cnt);
  isFreeze[cur] = true;
  dfs(cur + 1, cnt + 1);
}
double fix(double t) { return sqrt(t * t - 1); }
int main() {
  ios ::sync_with_stdio(false);
  cout << fixed << setprecision(10);
  cin >> N1 >> N2 >> N3;
  cin >> RNG1 >> RNG2 >> RNG3;
  cin >> ATK1 >> ATK2;
  RNG1 = fix(RNG1);
  RNG2 = fix(RNG2);
  RNG3 = fix(RNG3);
  N = N1 + N2 + N3;
  for (int i = 1; i <= N; i++) pos[i] = (i + 1) / 2;
  dfs(1, 0);
  cout << answer << endl;
  return 0;
}
