/*
* @Author: dnhirapara
* @Date: 2020-05-03 00:03
* @Name: dp_i
*/
// copied from - https://gist.github.com/IvanIsCoding/a1fe3bfb85210642d47cf48b292dd725
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 3002;

double dp[MAXN][MAXN],P[MAXN];
int vis[MAXN][MAXN],N;

double solve(int pos,int heads){

    if(heads < 0) return 0.0;

    if(pos == 0){
        return (heads == 0);
    }

    if(vis[pos][heads]) return dp[pos][heads];
    vis[pos][heads] = 1;

    return dp[pos][heads] =  (P[pos])*solve(pos-1,heads-1) + (1.0 - P[pos])*solve(pos-1,heads);

}

int main(){

    cin >> N;
    for(int i = 1;i<=N;i++){
        cin >> P[i];
    }

    double tot = 0;
    for(int heads = 0;heads<=N;heads++){
        int tails = N - heads;
        if(heads > tails) tot += solve(N,heads);
    }

    printf("%.9lf\n",tot);

    return 0;

}


// /*
// * @Author: dnhirapara
// * @Date: 2020-05-03 00:03
// * @Name: dp_i
// */

// #include <bits/stdc++.h>

// using namespace std;

// /************defination************/

// #define endl "\n"
// #define log(x) cerr << __LINE__ << ": " << #x << " -> " << (x) << endl;
// #define ll long long int
// #define ull unsigned long long int

// void in_out_file(){
//     #ifdef _DEBUG
//         freopen("F:/Coding/CompetitiveProg/static/input.txt", "r", stdin);
//         freopen("F:/Coding/CompetitiveProg/static/output.txt", "w", stdout);
//         freopen("F:/Coding/CompetitiveProg/static/debug.txt", "w", stderr);
//     #endif
// }

// double  sum = 0;
// ll n;
// vector<double> P(3002);
// ll dp[3001][3001];
// int vis[3002][3002];

// double solve(ll pos,ll heads){

//     if(heads < 0) return 0.0;

//     if(pos == 0){
//         return (heads == 0);
//     }

//     if(vis[pos][heads]) return dp[pos][heads];
//     vis[pos][heads] = 1;

//     return dp[pos][heads] =  (P[pos])*solve(pos-1,heads-1) + (1.0 - P[pos])*solve(pos-1,heads);

// }


// // void solve(ll h vector<double> &a, ll pos){
// //     if(pos-1==n && h<t){
// //         return 1;
// //     }
// //     if(pos-1>n)return;
// //     return a[pos-1]*solve(h-1,pos,a,pos+1);
// //     return (1-a[pos-1])*solve(h,pos, a,pos+1);
// // }


// //@time comp :
// //@space comp :
// int main(){
//     // cin.ignore(); must be there when using getline(cin, s)
//     #ifndef AUTO
//         in_out_file();
//     #endif
//         cout<<fixed<<std::setprecision(10);
//     ll tc = 1;
//     // cin>>tc;
//     for(ll i=0;i<=3000;i++){
//         for(ll j=0;j<=3000;j++){
//             dp[i][j] = -1;
//         }
//     }
//     while(tc--){
//         cin>>n;
//         for(ll i=1;i<=n;i++){
//             cin>>P[i];
//         }
//         double tot = 0;
//         for(int heads = 0;heads<=n;heads++){
//             int tails = n - heads;
//             if(heads > tails) tot += solve(n,heads);
//             log(tot)
//         }
//         cout<<tot<<endl;
//     }
//     return 0;
// }


// // void solve(double pro, vector<double> &a, ll pos){
// //     if(h+t==n && h>t){
// //         sum += pro;
// //     }
// //     if(os>=n)return;
// //     log(pos)
// //     solve(pro*a[pos],a,pos+1);
// //     solve(pro*(1-a[pos]),a,pos+1);
// // }


// // void solve(ll h, ll t,double pro, vector<double> &a, ll pos){
// //     if(h+t==n && h>t){
// //         // cout<<h<<" "<<t<<endl;
// //         // log(pro)
// //         sum += pro;
// //         cout<<"\n";
// //         // log(sum)
// //     }
// //     if(h<=0 || t<=0 || pos>=n)return;
// //     // log(h+t)
// //     // if(h+t==n){
// //     //     log(pro)
// //     //     sum+=pro;
// //     //     return;
// //     // }
// //     // if(h>=t){
// //     // cout<<h<<" "<<t<<endl;
// //         // log("above")
// //         // log(pro)
// //     log(pos)
// //         solve(h-1, t,pro*a[pos],a,pos+1);
// //         // log("below")
// //         // log(pro)

// //         solve(h, t-1,pro*(1-a[pos]),a,pos+1);
// //     // }else{
// //     //     return;
// //     // }
// // }


Measured memory_bytes: 105600