Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Python
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.01.2021, 22:05   #131
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Вместо объявления функции "p" можно написать просто "p = print".
1)
Код:
p_list = list(map(int, input().split()))
p_in_one, p_rem = divmod(sum(p_list), 3)
print("IMPOSSIBLE" if p_rem else sum(map(lambda i: abs(i - p_in_one), p_list)) // 2)
2) Получилось не особо компактно. Вроде никакой случай не потерял. Сохранить сначала все веса в один список не очень хорошая затея - может не хватить памяти.
Код:
max_val, max_count = None, 0
min_val, min_count = None, 0
s_sum, s_count = 0, 0

while True:
    try:
        for i in map(int, input().split()):
            if max_val is None:
                max_val, max_count = i, 1
                continue

            if min_val is None:
                if i > max_val:
                    min_val, min_count = max_val, max_count
                    max_val, max_count = i, 1
                elif i < max_val:
                    min_val, min_count = i, 1
                else:
                    max_count += 1
                continue

            if i > max_val:
                s_sum += max_val * max_count
                s_count += max_count
                max_val, max_count = i, 1
                continue

            if i == max_val:
                max_count += 1
                continue

            if i < min_val:
                s_sum += min_val * min_count
                s_count += min_count
                min_val, min_count = i, 1
                continue

            if i == min_val:
                min_count += 1
                continue

            s_sum += i
            s_count += 1
                    
    except EOFError:
        if s_count:
            print(round(s_sum / s_count))
        break
3)
Код:
t = (0, 0)
way = 0
ways = [(0, 1), (1, 0), (0, -1), (-1, 0)]
places = set([t])
for s in input():
    if s == "S":
        t = tuple(map(sum, zip(t, ways[way])))
        if t in places:
            print(len(places))
            break
        places.add(t)
    elif s == "L":
        way = (way + 3) % 4
    else:
        way = (way + 1) % 4
else:
    print(-1)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 29.01.2021 в 06:29.
BDA вне форума Ответить с цитированием
Старый 06.02.2021, 19:45   #132
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Одно задание которое не получилось

1)Какое наименьшее число n можно представить в виде произведения n = a∙b ровно k способами? Произведения a∙b и b∙a считаются одним способом, все числа натуральные (1 ≤ k ≤ 50).

Входные данные

Единственное число – значение k.

Выходные данные

Единственное число – значение n.

Пример

Пример входных данных
2

Пример выходных данных
4

Код:
k = int(input())
deliteli = []
n = 2
while len(deliteli) // 2 + 1 != k:
    deliteli = [1, n]
    for i in range(1, n // 2 + 1):
        if n % i == 0:
            deliteli.append(i)
    n += 1
print(n - 1)
FsGaCh вне форума Ответить с цитированием
Старый 06.02.2021, 22:02   #133
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Ну перебор всех N слишком дорогое удовольствие. Немного подумал в сторону представления числа, как произведения степеней нескольких простых чисел. В конце концов просто нашел достаточно хорошее объяснение решения на просторах интернета. Практическую реализацию оставляю на вашей совести.
Изображения
Тип файла: png n=ab.png (69.5 Кб, 3 просмотров)
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 07.02.2021, 20:13   #134
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Дробь вида m/n называется правильной, если 0 ≤ m < n и несократимой если НОД(m, n) = 1. Для заданного положительного целого n, в этой задаче необходимо найти количество несократимых правильных дробей со знаменателем n.

Например, существует всего лишь 4 несократимых правильных дроби со знаменателем 12:

1/12, 5/12, 7/12 и 11/12.

Входные данные

Каждая строка входных данных содержит одно единственное целое число n (n < 2000000000) и ввод продолжается пока не встретится число 0 в качестве n (для этого значения входные данные не обрабатываются).

Выходные данные

Для каждого n в выходном файле выведите в отдельной строке количество несократимых правильных дробей со знаменателем n.

Дошёл до сюда, подумывал продолжить но посмотрел в примеры и узнал что мне не уложится во временной лимит:
Код:
n = int(input())
while n != 0:
    dels = []
FsGaCh вне форума Ответить с цитированием
Старый 07.02.2021, 20:54   #135
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Название задачи на e-olymp само намекает, что стоит изучить теорию, связанную с функцией Эйлера.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 24.02.2021, 10:08   #136
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Это задание получилось очень грамостким, но думаю оно работает. Как можно упростить?

Кладбище имеет форму прямоугольника, в котором N рядов по M могил в каждом ряду. Кладбище окружено высокой стеной.
Лара Крофт по ночам проникает на кладбище через подкоп с северо-западного угла. За одну ночь она успевает прорыть подземный ход под одной из могил по такому правилу:
Если дальше по ходу движения находится целая могила, то Лара продолжает ход вперёд и расхищает содержимое этой могилы.
Если же впереди стена кладбища или уже разорённая могила, то Лара поворачивает на 90 градусов вправо и продолжает своё нелёгкое дело.
Сокровища находятся всего в двух могилах, и мы знаем, в каких, но Лара этого не знает. Сегодня ночью по дороге домой Лара купила ящик шампанского, значит, сегодня она нашла одну из могил с сокровищами. Мы хотим понять, через сколько дней она найдёт другую могилу?
Исходные данные
В первой строке записаны целые числа N и M — размеры кладбища (2 ≤ N, M ≤ 100). Северо-западная могила имеет координаты (1, 1), а юго-восточная — (N, M). Лара начинает с могилы (1, 1), двигаясь на восток, то есть к могиле (1, 2).
Во второй и третьей строке записаны целые числа (r1, c1) и (r2, c2) — координаты могил с сокровищами (1 ≤ ri ≤ N; 1 ≤ ci ≤ M). Порядок могил не фиксирован, поэтому может случиться и так, что Лара дороет ход до второй могилы раньше, чем до первой.
Результат
Выведите, через сколько дней Лара найдёт оставшиеся сокровища.

Код:
y, x = map(int, input().split())
y1, x1 = map(int, input().split())
y2, x2 = map(int, input().split())
graveyard = [[0 for i in range(x)] for k in range(y)]
n = [None, None]
graveyard[x1 - 1][y1 - 1], graveyard[y2 - 1][x2 - 1] = 2, 2
boolean, currentPosX, currentPosY = 0, 0, 0
while inside(graveyard, 2) and n[0] != True:
    if boolean == 0:
        if currentPosX == x - 1:
            boolean = 1
        elif graveyard[currentPosY][currentPosX + 1] == 1:
            boolean = 1
        else:
            if graveyard[currentPosY][currentPosX] == 2:
                if n[0] is None:
                    n[0] = False
                    n[1] = 0
                elif n[0] is False:
                    break
            graveyard[currentPosY][currentPosX] = 1
            currentPosX += 1
            if n[0] is False:
                n[1] += 1
    elif boolean == 1:
        if currentPosY == y - 1:
            boolean = 2
        elif graveyard[currentPosY + 1][currentPosX] == 1:
            boolean = 2
        else:
            if graveyard[currentPosY][currentPosX] == 2:
                if n[0] is None:
                    n[0] = False
                    n[1] = 0
                elif n[0] is False:
                    break
            graveyard[currentPosY][currentPosX] = 1
            currentPosY += 1
            if n[0] is False:
                n[1] += 1
    elif boolean == 2:
        if currentPosX == 0:
            boolean = 3
        elif graveyard[currentPosY][currentPosX - 1] == 1:
            boolean = 3
        else:
            if graveyard[currentPosY][currentPosX] == 2:
                if n[0] is None:
                    n[0] = False
                    n[1] = 0
                elif n[0] is False:
                    break
            graveyard[currentPosY][currentPosX] = 1
            currentPosX -= 1
            if n[0] is False:
                n[1] += 1
    else:
        if currentPosY == 0:
            boolean = 0
        elif graveyard[currentPosY - 1][currentPosX] == 1:
            boolean = 0
        else:
            if graveyard[currentPosY][currentPosX] == 2:
                if n[0] is None:
                    n[0] = False
                    n[1] = 0
                elif n[0] is False:
                    break
            graveyard[currentPosY][currentPosX] = 1
            currentPosY -= 1
            if n[0] is False:
                n[1] += 1
print(n[1])
Изображения
Тип файла: png 716dd73e-3e3e-48cc-aa9c-93b24e32f9c3.png (9.3 Кб, 31 просмотров)
FsGaCh вне форума Ответить с цитированием
Старый 24.02.2021, 18:18   #137
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Думаю, что можно еще сократить.
Код:
def grave_number(n, m, i, j):
    ring = min([i, j, n - i + 1, m - j + 1])
    prev_ring = ring - 1
    s = 0

    if ring > 1:
        s += 2 * prev_ring * (n + m - 2 * prev_ring)

    if i == ring:
        return s + j - prev_ring
    else:
        s += m - 2 * prev_ring

    if m - j + 1 == ring:
        return s + i - ring
    else:
        s += n - 2 * prev_ring - 1

    if n - i + 1 == ring:
        return s + m - j - prev_ring
    else:
        s += m - 2 * prev_ring - 1

    return s + n - i - prev_ring

n, m = map(int, input().split())
r1, c1 = map(int, input().split())
r2, c2 = map(int, input().split())
print(abs(grave_number(n, m, r1, c1) - grave_number(n, m, r2, c2)))
Идея в том, чтобы узнать номер могилы по её координатам. Если бы поле было больше, чем 100 на 100, то пытаться его просто обойти может быть слишком долго или дорого по памяти.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 08.03.2021, 15:19   #138
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Привет. Я только что был на олимпиаде, и там были некоторые задания. Я их сделал, они проходили примеры, но думаю перевышали временной лимит. И свои варианты сохранить не получилось, так что сдесь у меня не будут своего варианта.

1) В одной стране много сёл, и иногда несколько сёл имеют одинаковые названия. Но, тут для удобства вместо названий будем использовать числа.
В первой строке вводятся переменные n и q, количество сёл и количество приведённых тестов соответсвенно. Во второй строке вводятся n целых чисел, а в последцющих q строках вводятся числа. Вам нужно найти сколько сёл имеют названия qi.

Подзадачи: Если программа работает только для данных а <= 10^6, задание будет оцениватся в 37 баллов, а для всех значений, тогда 100 баллов
Код:
n, k = map(int, input().split())
towns = list(map(int, input().split()))
answers = []
for i in range(k):
    answers.append(towns.count(int(input())))
for i in answers:
    print(i)
2) Сейчас близится конец года, и студенты должны писать сочинения. Но поскольку Вася не готовился, то он решил переписать сочинение его брата который написал сочинение год назад. Но что бы избежать плагиаризма, он решил поменять местами слова наоборот в каждом предложении сочинения своего брата. И тут он решил спросить помощи у вас.
В первой строке вводится переменная n - количество предложений в сочинении брата Васи. Следуюшие n строк это количество слов в каждом предложении. Все эти слова уникальны. Вам нужно найти сумму разниц слов Васи и его брата. Например, если ni строка имела длину 3, то брат Васи писал это предложение подобно {1, 2, 3}, а Вася бы переписал его как {3, 2, 1}. То сумма разниц этих предложений должна быть |1 - 3| + |2 - 2| + |3 - 1| = 4.

Подзадачи: Если программа работает только со значениями t <= 100 и n <= 10^4, Тогда будет оцениватся в 27 баллов, а если для всех значений, то в 100 баллов.

Код:
import math
n = int(input())
tests = []
answers = []
for i in range(n):
    tests.append(list(range(1, int(input())+1)))
    sum = 0
    for k in range(len(tests[i])):
        sum += math.fabs(tests[i][k]-tests[i][-1-k])
    answers.append(int(sum))
for i in answers:
    print(i)
3) В одном гараже есть n количество коробок. Каждый из них либо белый, либо чёрный. Когда Кате не нравятся когда сразу после чёрных коробок находятся белые коробки, так что проходя мимо гаража Катя решила поменять их местами. За один раз она может поменять местами 2 соседних коробок, и будет выполнять это со всей кучей коробок. Сколько всего ей понадобится заходов по всей кучи коробок для того что бы там после чёрных коробок сразу не было белых коробок?
В первой строке вводится число t - количество тестов. В следуюших t пар строк в первой строке вводится число n - общее число коробок. А во второй строке вводятся сами коробки через пробел. 1 - чёрная коробка, 0 - белая коробка. Надо вывести в t строках сколько заходов по всем коробкам ей понадобится что бы поменять их местами так как ей нравится?

Пример: 1
5
1 1 0 1 0
При входных данных показанных выше Кате понадобится 3 захода по всем коробкам что бы поменять их местами так, как ей нравится.

Подзадачи: Если программа работает только для значений n <= 100, тогда будет оцениватся в 15 баллов, а если работает со всеми значениями, то в 100 баллов.

Код:
answers, tests, t = [], [], int(input())
for i in range(t):
    j = int(input())
    tests.append(list(map(int, input().split())))
for i in tests:
    p = i
    index = 0
    amount = 1
    while p != list(map(int, list(p.count(0) * '0' + p.count(1) * '1'))):
        if index == len(p) - 1:
            index = 0
            amount += 1
        if p[index] == 1 and p[index+1] == 0:
            p[index], p[index+1] = p[index + 1], p[index]
        index += 1
    answers.append(amount)
for i in answers:
    print(i)
4) В одном городке за день будет проводится t количество соревнований по верховной езде на конях. В каждый раз на испытании будет участвовать n количество коней, k из которых кони специальной породы. Эти кони отличаются тем что, у них обычные показатели скорости возрастают вдвое во время соревнований. Все кони на соревновании могут быть специальной породы, а может быть так что не соревновании нету ни одного коня специальной породы.
В первой строке вводится число t - количество соревнований. В последуюших n пар строк в первой строке вводятся числа n и k на одной строке через пробел - количество обычных и коней специальной породы на соревновании соответственно. Вам нужно найти, какой по номеру конь (нумерация будет начинатся с единицы) имеет наивысчий шанс победы на соревновании. Если их будет несколько, то их надо вывести на одной строке через пробелы.

Подзадачи: Если программа работает только со значенияси k = 0, то будет засчитыватся в 13 баллов. Если работает со значениями n <= 1000 и ∑n <= 1000, то оцениватся будет в 46 баллов, а если работает со всеми значениями, то в 100 баллов.

У меня и для этой задачи был свой вариант но он также не проходил не один из подзадач и также был очень грамостким.

Все эти задания я смог выполнить, выданные примеры они проходили по времени и памяти. Но почти никакие подзадачи они не проходили.
Лишь задача под номером 2 проходила подзадачу про значения t <= 100 и n <= 10^4, а остальные вообще никакую подзадачу не проходили.

Последний раз редактировалось FsGaCh; 08.03.2021 в 17:07.
FsGaCh вне форума Ответить с цитированием
Старый 08.03.2021, 20:47   #139
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

1) Не знаю, что там с потреблением памяти:
Код:
from collections import Counter

n, q = map(int, input().split())
villages = Counter(map(int, input().split()))
for i in range(q):
    print(villages[int(input())])
2)
Код:
n = int(input())
for i in range(n):
    t = int(input())
    print(2 * (t - t // 2) * (t // 2))
3)
Код:
for i in range(int(input())):
    input()
    ans = 0
    box_pos = 0
    for p, box in enumerate(input().split()):
        if box == '0':
            ans = max(ans, p - box_pos)
            box_pos += 1
    print(ans)
4) Чего-то в условии не хватает - сколько ни перечитывал, так и не понял, что подается на вход. Дается t - количество соревнований, затем t пар строк: в первой строке n и k, а во второй что?
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 08.03.2021 в 21:52.
BDA вне форума Ответить с цитированием
Старый 10.03.2021, 07:33   #140
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
4) Чего-то в условии не хватает - сколько ни перечитывал, так и не понял, что подается на вход. Дается t - количество соревнований, затем t пар строк: в первой строке n и k, а во второй что?
Да, я забыл указать что будет вводится во второй. Там надо будет вводить обычные показатели коней.

Последний раз редактировалось FsGaCh; 10.03.2021 в 07:39.
FsGaCh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
готовлюсь к олимпиаде по информатике salauat Паскаль, Turbo Pascal, PascalABC.NET 25 01.12.2013 21:32
Подготовиться к олимпиаде за лето UaKot Свободное общение 20 10.05.2013 18:53
Подготовка к региональной олимпиаде New man Помощь студентам 20 14.12.2012 21:01
Задачи по олимпиаде Darick Помощь студентам 7 23.12.2011 15:45
Как подготовиться к олимпиаде? Kn793 Помощь студентам 16 26.07.2008 12:22