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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2020, 12:29   #51
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
3)

Завести множество A с элементами от 1 до N. Затем считывать строку и преобразовывать во множество. Рассчитать множества при ответе YES и NO. Сравнить их длины. Если длина множества NO больше или равна длине множества YES, то ответ NO, иначе YES. Множество A заменяется на одно из рассчитанных множеств в соответствии с ответом.
Смог выполнить все, кроме №3:
2)
Код:
n = int(input())
words = set()
A = set()
for i in range(1, n+1):
    words.update(str(i))
commands = []
ans = ''
while ans != 'HELP':
    ans = input()
    commands.append(ans)
for i in range(len(commands)):
    if commands[i] == 'HELP':
        print(words)
        break
    elif commands[i] == 'YES':
        words = words.intersection(A)
    elif commands[i] == 'NO':
        words = words.difference(A)
    else:
        A = set(tuple(commands[i].split()))
4)
Код:
n = int(input())
c = 0
langs = []
l = []
kids = []
for i in range(n):
    c = int(input())
    l = []
    for i in range(c):
        l.append(input())
    l = tuple(l)
    langs.append(l)
for i in langs:
    kids.append(set(i))
inter = kids[0]
un = kids[0]
for i in range(len(kids)-1):
    inter = inter.intersection(kids[i+1])
for i in range(len(kids)-1):
    un = un.union(kids[i+1])
print(len(inter))
for i in inter:
    print(i)
print(len(un))
for i in un:
    print(i)
5)
Код:
nk = input().split()
n = int(nk[0])
k = int(nk[1])
g = []
for i in range(k):
    g.append(input().split())
c = set()
for i in range(len(g)):
    a = []
    b = []
    a_i = int(g[i][0])
    b_i = int(g[i][1])
    if i % 2 == 0:
        for f in range(a_i, n+1, b_i):
            if f % 7 not in [6, 0]:
                a.append(f)
    else:
        for f in range(a_i, n+1, b_i):
            if f % 7 not in [6, 0]:
                b.append(f)
    a = set(tuple(a))
    b = set(tuple(b))
    c = c.union(a.union(b))
print(len(c))
Если можно что-то упростить, буду благодарен если скажете.

Последний раз редактировалось FsGaCh; 07.06.2020 в 14:44.
FsGaCh вне форума Ответить с цитированием
Старый 07.06.2020, 18:38   #52
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

2) Нет смысла накапливать все входные данные, а потом их обрабатывать. И нельзя просто печатать множество, так как это не гарантирует вывод по возрастанию чисел.
Код:
n = int(input())
pr = set(range(1, n + 1))
while True:
    s = input()
    if s == 'HELP':
        break
    if s == 'NO':
        pr -= tmp
        continue
    if s == 'YES':
        pr &= tmp
        continue
    tmp = set(map(int, s.split(' ')))
print(" ".join(map(str, sorted(pr))))
3) Просто чуть-чуть измененная 2я.
Код:
n = int(input())
pr = set(range(1, n + 1))
while True:
    s = input()
    if s == 'HELP':
        break
    tmp = set(map(int, s.split(' ')))
    no_pr = pr - tmp
    yes_pr = pr & tmp
    if len(no_pr) >= len(yes_pr):
        print('NO')
        pr = no_pr
    else:
        print('YES')
        pr = yes_pr
print(" ".join(map(str, sorted(pr))))
4) Можно сразу сохранять множества языков для каждого школьника. Делать пересечение и объединение без цикла. Ну и языки нужно выводить в лексикографическом порядке. Этот код сработает только для положительного количества школьников.
Код:
n = int(input())
langs = []
for i in range(n):
    c = int(input())
    lang = set()
    for i in range(c):
        lang.add(input())
    langs.append(lang)
inter = langs[0].intersection(*langs[1:])
un = langs[0].union(*langs[1:])
print(len(inter))
for i in sorted(inter):
    print(i)
print(len(un))
for i in sorted(un):
    print(i)
5) Можно сразу обрабатывать входящие a и b. И не понял проверки i % 2 == 0.
Код:
n, k = map(int, input().split())
days = set()
for _ in range(k):
    a, b = map(int, input().split())
    days |= set(range(a, n + 1, b))
days -= set(range(6, n + 1, 7))
days -= set(range(7, n + 1, 7))
print(len(days))
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 07.06.2020 в 19:34.
BDA вне форума Ответить с цитированием
Старый 08.06.2020, 16:37   #53
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

2 задания:
1)Прямоугольную комнату размерами M на N (сначала по горизонтали, а потом по вертикали) замостили треугольными плитками и их пронумеровали, как показано на рисунке.
За один шаг можно переместиться с одной паркетины на другую только через общую сторону. Найти наименьшее количество шагов, нужных для перемещения с паркетины A на паркетину B.

Входные данные:
В первой строке входных данных через пробел заданы значения M, N (1 ≤ M, N ≤ 100), а во второй – A, B.

Выходные данные:
Искомое количество шагов.

Попробовал, сделал вот так, но не работает:
Код:
import math
mn = input().split()
m = int(mn[0])
n = int(mn[1])
x = m * 2
y = n * 2
ab = input().split()
a = int(ab[0])
b = int(ab[1])
ax = a // y + 1
ay = a // x + 1
bx = b // y + 1
by = b // x + 1
print(ax, ay, bx, by)
xl = math.fabs(bx-ax)
yl = math.fabs(by-ay)
l = xl + yl
print(l)
2)Биллиард представляет собой прямоугольник размерами MxN, где M и N – натуральные числа. Из верхней левой лузы вылетает шар под углом 45o к соседним сторонам. Лузы размещено только в углах биллиарда. Определите количество столкновений шара с бортами биллиарда, после которых он опять попадет в одну из луз, и номер лузы, в которую упадет шар. Считать, что трение отсутствует, столкновения абсолютно упругие, а шар – материальная точка.

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

Во входной строке два числа M и N (1 ≤ M, N ≤ 2000000000). Нумерация луз по часовой стрелке, начиная с левой верхней лузы, из которой вилетел шар, согласно рисунка. M – горизонтальная сторона биллиарда, N – вертикальная сторона биллиарда.
Выходные данные:

Два числа: количество отражений шара и номер лузы в которую упадет шар.

Я смог сделать лишь для третьей и второй лузы:
Код:
mn = input().split()
x = int(mn[0])
y = int(mn[1])
if segs % 2 == 0:
    print(int(x / y - 1), 2)
else:
    print(int(x / y - 1), 3)
Изображения
Тип файла: jpg л.jpg (26.3 Кб, 40 просмотров)
Тип файла: jpg ло.jpg (5.5 Кб, 39 просмотров)
FsGaCh вне форума Ответить с цитированием
Старый 08.06.2020, 21:36   #54
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Про замещение треугольными плитками. Я решал так: сначала проверить, не лежат ли плитки A и B на одной горизонтальной линии на полу, ведь тогда ответ очевиден (как раз модуль разницы их номеров). Если все-таки не повезло, и они лежат на разных линиях. Для понимания перерисовал пол в виде графа (номера плиток с одной линии выписал в ряд, а номера с другой линии под ними, соединил линиями те номера, которые имеют общую сторону). Считаю для удобства, что плитка A всегда имеет меньший номер (если нужно, просто меняю номера местами). Можно заметить, как при "спуске" от плитки A можно за одинаковое количество шагов попасть в более широкий диапазон плиток на следующей линии. Нахожу этот диапазон (номера плиток). Если плитка B имеет номер в этом диапазоне, то остается только проверить сразу ли при спуске попали в эту плитку, или нужно сделать еще 1 шаг в сторону. Если плитка не в этом диапазоне, то просто найти количество шагов от краев диапазона до плитки B и выбрать ближайший край.

Про Биллиард. В вашем коде потерялось определение segs. Очевидны ответы для случаев, когда N == M (ответ: 0 отражений, 3 луза) и когда одно на другое делится без остатка (шар попадает во 2, 3 или 4 лузу, а количество отражений равно частному минус один). Строго математически не смог решить, так что просто нарисовал путь шара для прямоугольников 3x4, 3x5, 3x7, 4x5, вывел по этим случаям формулу количества столкновений и выбор лузы (подсказки: четность-нечетность длин сторон прямоугольника, НОД).
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 09.06.2020 в 04:36.
BDA вне форума Ответить с цитированием
Старый 15.06.2020, 11:47   #55
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

биллиард
лист в прямоугольную сеточку c ячейкой MxN
много -много биллиардов, теперь шар не отражается, а переходит с поля на поле сохраняя направление.(симметрия однако).
запускаем из верхней левой точки(угла сетки)
когда он наконец опят пройдет через угол? (лузы только в углах!)
когда обрамляющая фигура будет квадрат.(мы движемся по диагонали этой фигуры)
размеры этого квадрата ?
сколько границ он при этом пересечет ?
вертикальных?
горизонтальных?
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Старый 18.06.2020, 13:17   #56
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

3 задачи которые смог выполнить, скажите как упростить:

1)Задан линейный массив целых чисел. Увеличить на 2 каждый неотрицательный элемент массива.
Входные данные
В первой строке задано количество элементов массива n (n ≤ 100). Во второй строке заданы сами элементы массива, значение каждого из которых по модулю не превышает 100.
Выходные данные
Вывести в одной строке n чисел: новые значения элементов массива в том же порядке, в котором они были заданы.

Мой вариант:
Код:
n = int(input())
s = input().split()
for i in s:
    if int(i) >= 0:
        print(int(i)+2, end=' ')
    else:
        print(i, end=' ')
2)Дано натуральное число N и массив из N действительных чисел. Найти сумму его элементов.
Формат входных данных
В первой строке задано одно число N (1 <= N <= 10000). В следующей строке задано N действительных чисел, разделенных одним пробелом, – элементы массива.
Формат выходных данных
В одной строке искомая сумма с двумя цифрами после точки.

Мой вариант:
Код:
n = int(input())
s = input().split()
sum = 0
for i in s:
    sum += float(i)
print(f"{sum:.2f}")
3)Дано натуральное число N и массив из N целых чисел. Найти количество отрицательных элементов массива.
Формат входных данных
В первой строке задано одно число N (1 <= N <= 10000). В следующей строке задано N целых чисел, разделенных одним пробелом, – элементы массива.
Формат выходных данных
Вывести количество отрицательных чисел.

Мой вариант:
Код:
n = int(input())
s = input().split()
c = 0
for i in s:
    if float(i) < 0:
        c += 1
print(c)
FsGaCh вне форума Ответить с цитированием
Старый 18.06.2020, 20:59   #57
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

1)
Код:
n = int(input())
s = input().split()
for i in map(int, s):
    if i >= 0:
        print(i + 2, end = ' ')
    else:
        print(i, end = ' ')
2)
Код:
n = int(input())
res = sum(map(float, input().split()))
print(f"{res:.2f}")
3) В условии целые числа, а не действительные.
Код:
n = int(input())
print(len(list(filter(lambda x: int(x) < 0, input().split()))))
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

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

Цитата:
Сообщение от BDA Посмотреть сообщение
1)
Код:
n = int(input())
s = input().split()
for i in map(int, s):
    if i >= 0:
        print(i + 2, end = ' ')
    else:
        print(i, end = ' ')
2)
Код:
n = int(input())
res = sum(map(float, input().split()))
print(f"{res:.2f}")
Благодарю
FsGaCh вне форума Ответить с цитированием
Старый 22.06.2020, 12:42   #59
FsGaCh
Пользователь
 
Регистрация: 08.02.2020
Сообщений: 78
По умолчанию

Привет всем. Хотел бы узнать как упростить эти задачки:

1)Дано натуральное число N и массив из N целых чисел. Определить симметричны ли значения элементов массива.
Формат входных данных
В первой строке задано одно число N (1 <= N <= 10000). В следующей строке задано N целых чисел, разделенных одним пробелом, – элементы массива.
Формат выходных данных
Если элементы массива симметричны – выведите слово “YES” (без ковычек), в противном случае выведите слово “NO”.

Мой вариант:
Код:
n = int(input())
numbers = input().split()
numberss = tuple(numbers)
yn = 0
h = len(numberss) // 2
for i in range(h, 0, -1):
    if numberss[i-1] == numbers[len(numberss)-i]:
        yn += 1
if yn == len(numberss) // 2:
    print("YES")
else:
    print('NO')
2)Дано натуральное число N и массив из N целых чисел. Найти максимальный элемент этого массива.
Формат входных данных
В первой строке задано одно число N (1 <= N <= 10000). В следующей строке задано N целых чисел, разделенных одним пробелом, – элементы массива.
Формат выходных данных
Выведите значение максимального элемента.

Мой вариант:
Код:
n = int(input())
nums = input().split()
for i in range(len(nums)):
    nums[i] = int(nums[i])
print(sorted(nums)[::-1][0])
3)Дано натуральное число N и массив из N целых чисел. Найти номер первого максимального элемента этого массива.
Формат входных данных
В первой строке задано одно число N (1 <= N <= 10000). В следующей строке задано N целых чисел, разделенных одним пробелом, – элементы массива.
Формат выходных данных
Выведите номер первого максимального элемента массива (нумерация элементов массива начинается с 0).

Мой вариант:
Код:
n = int(input())
numbers = input()
nums = numbers.split()
for i in range(len(nums)):
    nums[i] = int(nums[i])
max = sorted(nums)[::-1][0]
for i in range(len(nums)):
    if nums[i] == max:
        print(i)
        break
FsGaCh вне форума Ответить с цитированием
Старый 22.06.2020, 13:20   #60
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

1)
Код:
n = int(input())
numbers = input().split()
lnum = len(numbers)
for i in range(lnum // 2):
    if numbers[i] != numbers[lnum - i - 1]:
        print("NO")
        quit()
print("YES")
2)
Код:
n = int(input())
print(max(map(int, input().split())))
3)
Код:
n = int(input())
nums = list(map(int, input().split()))
print(nums.index(max(nums)))
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 22.06.2020 в 13:37.
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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