1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
def solve_example(n, t, probs):
    # Posortuj malejąco – optymalnie warto odpowiadać na pytania o najwyższym p.
    sorted_probs = sorted(probs, reverse=True)
    best = 0.0
    # Odpowiadamy tylko na k pytań, przy czym k musi być >= t (bo gdy k < t, nawet przy samych poprawnych odpowiedziach
    # wynik = k < t, czyli niezdanie)
    for k in range(t, n + 1):
        subset = sorted_probs[:k]
        # Wymagana liczba poprawnych odpowiedzi, żeby suma 2*r - k >= t
        L = (t + k + 1) // 2
        # dp[j] – prawdopodobieństwo, że przy rozpatrzonych pytaniach uzyskaliśmy dokładnie j poprawnych odpowiedzi.
        dp = [0.0] * (k + 1)
        dp[0] = 1.0
        # Przechodzimy kolejne pytania i aktualizujemy dp (przechodzimy od tyłu, aby nie nadpisać danych)
        for i, p in enumerate(subset):
            # Dla i-tego pytania (indeks i), przy dotychczasowym dp, aktualizujemy
            for j in range(i, -1, -1):
                dp[j + 1] += dp[j] * p
                dp[j] *= (1 - p)
        # Suma prawdopodobieństw uzyskania co najmniej L poprawnych odpowiedzi
        prob_pass = sum(dp[j] for j in range(L, k + 1))
        if prob_pass > best:
            best = prob_pass
    return best

# Wczytanie danych wejściowych
n, t = map(int, input().split())
probs = [float(input()) for _ in range(n)]

# Obliczanie wyniku
result = solve_example(n, t, probs)

# Wypisanie wyniku z dokładnością do 20 miejsc po przecinku (bez notacji naukowej)
print(f"{result:.20f}")