У вас есть Unexpected text node: ' ...
Créé le : 20 février 2025
Créé le : 20 février 2025
У вас есть
Unexpected text node: '
'
n монет. Любое количество из них вы можете сдать, получив за это соответствующее вознаграждение. Оставшиеся монеты подбрасываются, и вы получаете
Unexpected text node: '
'
3
k
рублей, где
Unexpected text node: '
'
k — количество выпавших решек. Какова оптимальная стратегия?
Формат ввода
В первой строке целое положительное число
Unexpected text node: '
'
n⩽60 — количество монет.
Во второй строке
Unexpected text node: '
'
n целых неотрицательных чисел
Unexpected text node: '
'
a
1
,a
2
,…,a
n
через пробел, где
Unexpected text node: '
'
a
i
⩽10
18
— вознаграждение за возврат
Unexpected text node: '
'
i монет.
Формат вывода
Выведите количество сдаваемых монет, при которых математическое ожидание суммарного выигрыша максимально. Если оптимальных стратегий несколько, выведите все варианты через пробел в порядке возрастания.
Пример 1
Ввод
3
4 8 9
Вывод:
2 3
Примечания
В первом примере монета всего одна, в таком случае всего два варианта: сдавать монету или не сдавать. Сдав монету, мы получим гарантированные 6 рублей (5 за сдачу монеты и
Unexpected text node: '
'
1=3
0
за 0 выпавших решек, так как не было монет для подбрасывания); не сдав монету, мы получим 1 рубль или 3 рубля в зависимости от результата подбрасывания. Видно, что оптимальным вариантом является сдать монету.
Во втором примере одинаково хорошими стратегиями являются сдать 2 или 3 монеты; обе стратегии лучше, чем сдать 1 монету или не сдавать монет.
реши на питоне
Ниже приведено разъяснение и решение задачи на языке Python.
Пусть мы подбрасываем монет. Каждая монета выпадает решкой с вероятностью . Тогда:
Мат. ожидание выигранной суммы:
С помощью биномиальной формулы для :
Тогда
Значит,
Таким образом, если вы оставили на подбрасывание монет, ожидаемый выигрыш от подбрасываний есть .
При выборе (число сдаваемых монет):
Общее мат. ожидание:
Нужно перебрать все от 0 до и найти те , для которых максимально.
textn = 3 a = [4, 8, 9] # это означает a_1=4, a_2=8, a_3=9, а a_0=0
Считаем мат. ожидания:
Максимум равен 10, достигается при и . Поэтому в ответе выводятся: 2 3
.
pythondef solve(): import sys data = sys.stdin.read().strip().split() n = int(data[0]) # Считали n, далее идут n чисел: a_1, a_2, ..., a_n a = list(map(int, data[1:] )) # Подразумеваем a_0 = 0, поэтому вставим в начало массива: # теперь a[x] будет соответствовать ровно вознаграждению за x монет a = [0] + a # теперь длина a = n+1, индексы 0..n # Будем перебирать x от 0 до n # Считаем E(x) = a[x] + 2^(n-x) # Ищем максимум, записываем все варианты, дающие этот максимум. from math import comb # Python 3.8+, но для 2^(n-x) comb не нужен # хотя comb не требуется, можно просто 1 << (n - x) или pow(2, n-x) best_value = -1 results = [] for x in range(n+1): # вознаграждение = a[x] # ожидаемый выигрыш от подбрасывания = 2^(n-x) current_value = a[x] + (1 << (n - x)) # (1 << k) то же самое, что 2^k, но быстрее if current_value > best_value: best_value = current_value results = [x] elif current_value == best_value: results.append(x) # Выводим все оптимальные x в возрастающем порядке print(" ".join(map(str, results)))
1 << k
, что сдвигает двоичное представление 1 на битов влево.Таким образом, решение работает за и легко укладывается в любые ограничения (операции с числами до и Python выполняет без проблем).