Опишите, пожалуйста, что делается в каждой строке
def Merge(mass, p, q, r):
left = mass[p : q + 1]
right = mass[q + 1 : r + 1]
i, j, k = 0, 0, p
while i < len(left) and j < len(right):
if left[i] < right[j]:
mass[k] = left[i]
i += 1
else:
mass[k] = right[j]
j += 1
k += 1
while i < len(left):
mass[k] = left[i]
i += 1
k += 1
while j < len(right):
mass[k] = right[j]
j += 1
k += 1
Answers & Comments
Привет питонистам!
# - значок комментария, я использовала его, чтобы, если что, была возможность запустить код и свериться со всем в процессе
Вроде, примерно я всё описала, но если что-то не до конца понятно, можешь спрашивать!! Код действительно не самый тривиальный, но, вроде, это одна из реализаций merge sort или сортировки слиянием
Насколько я понимаю, в результате вызова этой подпрограммы мы проходимся по части массива (с элемента под номером p и до последнего) и при этом постоянно сравниваем элементы из двух частей от этой части массива - левой и правой. Таким образом, если у нас mass = {6, 3, 5, 1, 2, 7}, p = 0, q = 2, r = 5
Получаем left = {6, 3, 5}, right = {1, 2, 7}
И, проходясь по циклу while, получаем следующие значения:
1-ая итерация цикла: 6 > 1 => mass = {1, 3, 5, 1, 2, 7}
2-ая: 6 > 2 => mass = {1, 2, 5, 1, 2, 7}
3-я: 6 < 7 => mass = {1, 2, 6, 1, 2, 7}
4-я: 3 < 7 => mass = {1, 2, 6, 3, 2, 7}
5-я: 5 < 7 => mass = {1, 2, 6, 3, 5, 7}
Затем наш цикл заканчивается, так как просмотрены все элементы массива left, но, так как мы не поставили на место последний элемент массива right, запустится самый нижний цикл. Нам повезло и семёрка уже стоит на своём месте, но программа перепишет её ещё раз
Итог первого прохода программы: mass = {1, 2, 6, 3, 5, 7}
Как мы видим, произошла частичная сортировка, но, чтобы полностью отсортировать массив, требуется больше одного подхода и сходу весь алгоритм я написать не смогу - если это нужно, напиши и я попробую разобраться через какое-то время
# def - слово, говорящее нам о том, что перед нами подпрограмма/функция
# Атрибуты:
# mass - некоторый массив чисел
# p, q, r - некоторые значения. Имеет смысл вводить такие, что p <= q < r
def Merge(mass, p, q, r):
# Вводим массив left: это новый массив, включающий в себя с p-ого по (q+1)-ый элементы массива mass
left = mass[p : q + 1]
# Вводим массив right: это новый массив, включающий в себя с (q+1)-ого по (r+1)-ый элементы массива mass
right = mass[q + 1 : r + 1]
# i, j, k - традиционные наименования переменных циклов
i, j, k = 0, 0, p
# len() - функция для подсчёта количества элементов в массиве
# Соответственно, цикл выполняется до тех пор, пока не будут просмотрены все элементы в массиве left или все - в массиве right
while i < len(left) and j < len(right):
# Вначале мы проверяем, больше ли i-ый элемент массива left j-ого в массиве right
if left[i] < right[j]:
# Если да, заменяем k-ый элемент массива i-ым элементом массива left
mass[k] = left[i]
# И прибавляем к i единицу, чтобы сдвинуть цикл
i += 1
else:
# Если нет, заменяем k-ый элемент массива j-ым элементом массива right
mass[k] = right[j]
# И сдвигаем j на единицу
j += 1
# После этого, вне зависсимости от результата условия, сдвигаем k
k += 1
# Затем, так как есть шанс, что элементы в каком-то из массивов не просмотрены до конца, проверяем массивы
# Если программа не прошлась до конца массива left, она перекладывает все элементы из него в массив mass
while i < len(left):
mass[k] = left[i]
i += 1
k += 1
# Если программа не прошлась до конца массива right, она перекладывает все элементы из него в массив mass
while j < len(right):
mass[k] = right[j]
j += 1
k += 1
def keyCount(n, actualClicks, maxClicks):
clickCount = [0] * n
for click in actualClicks:
clickCount[click - 1] += 1
for i in range(n):
if maxClicks[i] < clickCount[i]:
print('YES')
else:
print('NO')
n = int(input())
maxClicks = [int(i) for i in input().split()]
k = int(input())
actualClicks = [int(i) for i in input().split()]
keyCount(n, actualClicks, maxClicks)
На региональном этапе Всероссийской олимпиады школьников по информатике в 2009 году предлагалась следующая задача.
Всем известно, что со временем клавиатура изнашивается,и клавиши на ней начинают залипать. Конечно, некоторое время такую клавиатуру еще можно использовать, но для нажатий клавиш приходиться использовать большую силу.
Первая строка входных данных содержит целое число
n
(1≤≤1000
1
≤
n
≤
1000
) —количество клавиш на клавиатуре. Вторая строка содержит
n
целых чисел —с1
с
1
, с2
с
2
, … , с
с
n
, где с
с
i
(1≤≤100000
1
≤
c
i
≤
100000
) — количество нажатий,выдерживаемых
i
-ой клавишей. Третья строка содержит целое число
k
(1≤≤100000
1
≤
k
≤
100000
) — общее количество нажатий клавиш, и последняя строка содержит
k
целых чисел
p
j
(1≤≤
1
≤
p
j
≤
n
) — последовательность нажатых клавиш.
Программа должна вывести n строк, содержащих информацию об исправности клавиш.Если
i
-я клавиша сломалась, то
i
-ая строка должна содержать слово YES,если же клавиша работоспособна — слово NO.
Примеры
входные данные
5
1 50 3 4 3
16
1 2 3 4 5 1 3 3 4 5 5 5 5 5 4 5
выходные данные
YES
NO
NO
NO
YES