#include <bits/stdc++.h>
using namespace std;
int s1, s2, s3;
int r1, r2, r3;
int d1, d2, n, cnt, cnt2;
int vis[25];
double ans;
struct node {
  double s, t;
} A[25];
struct node2 {
  double hp1, hp2;
  bool operator<(node2 b) const { return hp1 - hp2 > b.hp1 - b.hp2; }
} B[25];
void dfs(int s, int sum) {
  if (s > n) {
    double all = 0;
    cnt2 = 0;
    for (int i = 1; i <= n; i++) {
      if (vis[i]) continue;
      double ms, mt, hp;
      ms = (i + 1) / 2 - sqrt(1.0 * r1 * r1 - 1);
      mt = (i + 1) / 2 + sqrt(1.0 * r1 * r1 - 1);
      hp = (mt - ms) * d1;
      for (int j = 1; j <= s3; j++) {
        double l = max(ms, A[j].s), r = min(mt, A[j].t);
        if (l < r) hp += (r - l) * d1;
      }
      ++cnt2;
      B[cnt2].hp1 = hp;
      ms = (i + 1) / 2 - sqrt(1.0 * r2 * r2 - 1);
      mt = (i + 1) / 2 + sqrt(1.0 * r2 * r2 - 1);
      hp = (mt - ms) * d2;
      for (int j = 1; j <= s3; j++) {
        double l = max(ms, A[j].s), r = min(mt, A[j].t);
        if (l < r) hp += (r - l) * d2;
      }
      B[cnt2].hp2 = hp;
    }
    sort(B + 1, B + cnt2 + 1);
    for (int i = 1; i <= s1; i++) all += B[i].hp1;
    for (int i = s1 + 1; i <= s1 + s2; i++) all += B[i].hp2;
    ans = max(ans, all);
    return;
  }
  if (sum < s3) {
    ++cnt;
    vis[s] = 1;
    A[cnt].s = (s + 1) / 2 - sqrt(1.0 * r3 * r3 - 1);
    A[cnt].t = (s + 1) / 2 + sqrt(1.0 * r3 * r3 - 1);
    dfs(s + 1, sum + 1);
    --cnt;
    vis[s] = 0;
  }
  if (n - s >= s3 - sum) dfs(s + 1, sum);
}
int main() {
  scanf("%d%d%d", &s1, &s2, &s3);
  scanf("%d%d%d", &r1, &r2, &r3);
  scanf("%d%d", &d1, &d2);
  n = s1 + s2 + s3;
  dfs(1, 0);
  printf("%.6lf\n", ans);
}
