import sys def solve_exam(n, t, probabilities): # Sortujemy prawdopodobieństwa malejąco, bo chcemy odpowiadać na najlepsze pytania probabilities.sort(reverse=True) # DP dla przechowywania prawdopodobieństwa zdobycia dokładnie i punktów dp = [0] * (n + 1) dp[0] = 1.0 # Prawdopodobieństwo zdobycia 0 punktów na początku for p in probabilities: for j in range(n, 0, -1): dp[j] = dp[j-1] * p + dp[j] * (1 - p) # Aktualizacja DP # Sumujemy prawdopodobieństwa zdobycia t lub więcej punktów result = sum(dp[t:]) return f"{result:.20f}" # Formatowanie wyniku do 20 miejsc po przecinku if __name__ == "__main__": # Wczytywanie danych wejściowych n, t = map(int, sys.stdin.readline().split()) probabilities = [float(sys.stdin.readline().strip()) for _ in range(n)] # Rozwiązanie i wypisanie wyniku print(solve_exam(n, t, probabilities))
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 | import sys def solve_exam(n, t, probabilities): # Sortujemy prawdopodobieństwa malejąco, bo chcemy odpowiadać na najlepsze pytania probabilities.sort(reverse=True) # DP dla przechowywania prawdopodobieństwa zdobycia dokładnie i punktów dp = [0] * (n + 1) dp[0] = 1.0 # Prawdopodobieństwo zdobycia 0 punktów na początku for p in probabilities: for j in range(n, 0, -1): dp[j] = dp[j-1] * p + dp[j] * (1 - p) # Aktualizacja DP # Sumujemy prawdopodobieństwa zdobycia t lub więcej punktów result = sum(dp[t:]) return f"{result:.20f}" # Formatowanie wyniku do 20 miejsc po przecinku if __name__ == "__main__": # Wczytywanie danych wejściowych n, t = map(int, sys.stdin.readline().split()) probabilities = [float(sys.stdin.readline().strip()) for _ in range(n)] # Rozwiązanie i wypisanie wyniku print(solve_exam(n, t, probabilities)) |