#include<iostream>
#include<algorithm>
#include<vector>
#include<cmath>
#include<iomanip>
#include<cassert>
#include<queue>
#include<map>
#define REP(i,s,n) for(int i=s;i<n;i++)
#define rep(i,n) REP(i,0,n)
#define MAX 101
#define inf (1<<29)
using namespace std;
int a[MAX];
int A[10001];
int n;
double b,r,v,e,f;
double mincost[MAX][10001];

struct P
{
  int last;
  double x,cost,now;
  P(double now=-1,double x=-1,double cost=-1,int last=-1):now(now),x(x),cost(cost),last(last){}
  bool operator < (const P &a)const
  {
    return cost >= a.cost;
  }
};

double getCost(double x)
{
  if(x >= r)return 1.0/(v - e * (x - r));
            return 1.0/(v - f * (r - x));    
}

void dijkstra()
{
  double ans = inf;
  rep(i,n)rep(j,10001)mincost[i][j] = inf;
  mincost[0][0] = 0;

  priority_queue<P> Q;
  Q.push(P(0,0,0,0));

  while(!Q.empty())
    {
      P p = Q.top(); Q.pop();
      if(p.now >= a[n-1])
	{
	  ans = min(ans,p.cost);
	  continue;
	}    

      if(ans <= p.cost)continue;

      assert(0 <= p.cost);
      double ncost = p.cost + getCost(p.x);
      assert(0 <= ncost);

      if(mincost[p.last][(int)p.now+1] > ncost)
	{
	  mincost[p.last][(int)p.now+1] = ncost;
	  Q.push(P(p.now+1,p.x+1,ncost,p.last));
	}

      if(A[(int)p.now+1] != -1)
	{
	  double change_cost = (A[(int)p.now+1]==n?0:b);
	  ncost += change_cost;
	  Q.push(P(p.now+1,0,ncost,A[(int)p.now+1]));
	}

    }

  cout << setiosflags(ios::fixed) << setprecision(4) << ans << endl;
}

int main()
{
  while(cin >> n,n)
    {
      rep(i,10001)A[i] = -1;
      rep(i,n)
	{
	  cin >> a[i];	 
	  A[a[i]] = i+1; 
	}
      cin >> b >> r >> v >> e >> f;
   

      dijkstra();

    }
  return 0;
}