A
A
Anodev2019-08-20 19:33:16
Python
Anodev, 2019-08-20 19:33:16

Can this code be considered a solution to this problem?

Hello! I am preparing for the exam in computer science. And I need to know if my code can be considered a solution to this problem? Also, I would like to know how effective it is. According to the input and output given in the task, my code produces the desired result. Please do not kick too much for bad code, because I am relatively new to python.

Task screenshots.
5d5c20e52a670017912251.png
5d5c20ee1c4ed031473269.png

My code.
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]))

Time and memory efficient code from the answers.
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)

Answer the question

In order to leave comments, you need to log in

1 answer(s)
L
longclaps, 2019-08-20
@Anodev

Yes, this is an efficient code: after all, we do not know why it is, and we cannot say otherwise.
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))

For large arrays of numbers (12000 is already a lot), this solution is more efficient:
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)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question