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}")
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}") |
English