помогите ускорить выполнение кода
имеется задача с олимпиады:
Условие: Задача денег. Ярослав и Мирослава имеют общую коллекцию из ? монет. Как символ своей дружбы они хотят отдельно хранить такую пару монет, что в сумме нарицательная стоимость этих двух монет дает особое число ?. Подсчитайте количество разных способов выбрать нужную пару.
Технические условия: Программа Money читает с устройства стандартного ввода натуральные числа ? и ? не менее 2. Во второй строке ? натуральных чисел — номинальные стоимости монет из коллекции. Все числа (включая числа ? и ?) не превышают 200000. Программа выводит на устройство стандартного вывода единственное число — количество способов выбрать две монеты с суммарной номинальной стоимостью ?. Известно, что искомое количество не превышает 10^9.
написал код, но не проходит даже 25% тестов, ибо слишком медленно. вот мой код:
s, n = map(int, input().split())
m = list(map(int, input().split()))
m.sort()
count = 0
for i in reversed(m):
if i >= s:
m = m[:len(m)-1:]
else:
break
while True:
zapper_start = m[0]
first_counter = 0
zap_m = m
last_obr = 0
if m[0] != m[-1]:
for i in reversed(m):
if i + zapper_start != s:
zap_m = zap_m[:len(m)-1:]
last_obr += 1
else:
zapper_last = zap_m[-1]
m = m[:len(m)-last_obr:]
last_counter = 0
for j in reversed(m):
if j == zapper_last:
m = m[:len(m)-1:]
last_counter += 1
else:
break
for j in m:
if j == zapper_start:
m = m[1::]
first_counter += 1
else:
break
count += (last_counter * first_counter)
break
else:
counter = 0
twos_count = 0
for num in m:
twos_count += 1
counter += twos_count - 1
count += counter
break
if not m:
break
print(count)
помогите максимально ускорить его выполнение, либо как-то изменить решение.
UPD: тут можно проверить количество баллов: https://new.netoi.org.ua/index_ua.php?lng=ua&cid=2113
решение на 11 баллов из 100:
s, n = map(int, input().split())
nominal = list(map(int, input().split()))[:n:]
counter = 0
while True:
delItem = nominal.pop(len(nominal)-1)
for i in nominal:
suma = delItem + i
if suma == s:
counter += 1
if len(nominal) == 0:
print(counter)
break
Ответы (1 шт):
Я если честно не сразу понял ТЗ. Вот если кому то нужно.
1
Сумма монет: 4. Кол-во монет: 5.
Номиналы: 2 2 3 2 1
Варианты: 4
2
Сумма монет: 10. Кол-во монет: 3.
Номиналы: 6 2 10
Варианты: 0
В первом примере дети могут выбрать пару одним из четырех способов: взять первую и вторую монеты; или первую и четвертую; или вторую и четвертую; или третью и пятую. Во втором примере никакие две монеты, к сожалению, не дают на сумму стоимость 10.
UPD. Написал код. Вообщем. s - сумма 2х монет, n - количество монет, не вводил а сразу в массив записал для простоты по примеру.
s = input("Введите сумму: ")
s = int(s)
#nominal = input("Введите количество монет: ")
#nominal = int(n)
nominal = [2, 2, 3, 2, 1]
counter = 0
while True:
delItem = nominal.pop(len(nominal)-1)
for i in nominal:
sum = delItem+i
if sum == s:
counter+=1
if len(nominal) == 0:
print(f"Количество вариантов : {counter}")
break