{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE ScopedTypeVariables #-}
import qualified Data.ByteString.Char8 as BS
import qualified Data.Vector.Unboxed as U
import qualified Data.Vector.Unboxed.Mutable as UM

-- n := V.length v + 1
-- v ! i = 表が i 枚、裏が n - i 枚出る確率
solve :: [Double] -> U.Vector Double
solve ps = go ps (U.singleton 1)
  where
    go [] !vec = vec
    go (!p:ps) !vec = go ps $
      -- U.zipWith (\u v -> p * u + (1 - p) * v) (0 `U.cons` vec) (vec `U.snoc` 0)
      U.create $ do
        let !n = U.length vec
        vec2 <- UM.new (n + 1)
        UM.write vec2 0 $ (1 - p) * vec U.! 0
        U.copy (UM.init $ UM.tail vec2) $ U.zipWith (\u v -> p * u + (1 - p) * v) vec (U.tail vec)
        UM.write vec2 n $ p * vec U.! (n - 1)
        return vec2

main = do
  n :: Int <- readLn
  -- 1 <= n <= 2999, n is odd
  ps :: [Double] <- map (read . BS.unpack) . BS.words <$> BS.getLine
  let result = solve ps
  -- U.length result == n + 1
  print $ U.sum $ U.drop (n `quot` 2 + 1) result
