@Anodev

Можно ли считать этот код решением данной задачи?

Здравствуйте! Я готовлюсь к ЕГЭ по информатике. И мне необходимо узнать, можно ли считать мой код решением данной задачи? Также, хотелось бы узнать насколько он эффективен. По приведённым в задаче входным и выходным данным, мой код выдает нужный результат. Прошу особо не пинать за плохой код, ибо в python я относительно новичок.

Скриншоты задачи.
5d5c20e52a670017912251.png
5d5c20ee1c4ed031473269.png

Мой код.
def main(n: int):
    # Инициализируем переменные
    m = 120 # Число m из задачи.
    pair = [0, 0] # Массив для непроверенной пары.
    pair2 = [0, 0] # Массив полностью проверенной пары.
    indexes = [-1, n+1] # Массив индексов непроверенной пары
    # Запускаем цикл.
    for i in range(n):
        # Читаем число.
        num = int(input())
        if pair[0] > num: # Делаем проверку на соответствие условию i < j.
            indexes[1] = i  # Назначаем новый индекс для j.
            pair[1] = num  # Вносим непроверенный i элемент.
        if pair[1] < num: # Делаем проверку на соответствие условию i < j.
            indexes[0] = i  # Назначаем новый индекс для i.
            pair[0] = num  # Вносим непроверенный j элемент .
        # Вычисляем сумму непроверенных элементов.
        sums = pair[0] + pair[1]
        # Выполняем проверку непроверенной пары по другим условиям задачи:
        # Соответствие условию i < j; a[i] > a[j]. Также выполняется проверка на делимость a[i]+a[j] на m.
        if indexes[0] < indexes[1] and pair[0] > pair[1] and sums % m == 0:
            # Проверяем на максимальную сумму элементов.
            if sums > pair2[0]+pair2[1]:
                pair2[0] = pair[0]
                pair2[1] = pair[1]
    # Возвращаем массив, содержащий пару проверенных элементов.
    return pair2


if __name__ == "__main__":
    # Читаем кол-во чисел. (2 <= n <= 12000)
    n = int(input())
    # Отправляем число в функцию.
    result = main(n)
    # Выводим данные в соответствии с требованиями задания.
    print("{} {}".format(result[0], result[1]))

Эффективный код по времени и памяти из ответов.
m = 120
# создание массива для максимальных значений
# для каждого из остатков
r = [0] * m
# обнуление переменных для записи ответа
left = 0
right = 0
# ввод количества элементов
n = int(input())
# ввод значений, поиск искомой пары
for i in range(n):
    a = int(input())
    p = a % m;
    if r[(m - p) % m] > a and r[(m - p) % m] + a > left + right:
        #обновление ответа
        left = r[(m - p) % m]
        right = a;
    # обновление элемента r для соответствующего остатка
    if a > r[p]:
        r[p] = a
print(left, right)
  • Вопрос задан
  • 341 просмотр
Решения вопроса 1
longclaps
@longclaps
Да, это эффективный код: ведь мы не знаем, зачем он, и не можем утверждать обратного.
UPDATE
from itertools import combinations

print(*max(filter(lambda p: p[0] > p[1] and not sum(p) % 120,
                  combinations([int(input()) for _ in range(int(input()))], 2)), key=sum))


Для больших массивов чисел (12000 - это уже много) более эффективно такое решение:
l, best = [-1] * 120, -1
for _ in range(int(input())):
    x = int(input())
    y = l[-x % 120]
    if x < y > best - x:
        yx, best = (y, x), y + x
    l[x % 120] = max(l[x % 120], x)
print(*yx)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы