Системный администратор раз в неделю создаёт архив пользовательских файлов. Однако объём диска, куда он помещает архив, может быть меньше, чем суммарный объём архивируемых файлов. Известно, какой объём занимает файл каждого пользователя. По заданной информации об объёме файлов пользователей и свободном объёме на архивном диске определите максимальное число пользователей, чьи файлы можно сохранить в архиве, а также максимальный размер имеющегося файла, который может быть сохранён в архиве, при условии, что сохранены файлы максимально возможного числа пользователей. Входные данные: В первой строке входного файла находятся два числа: S— размер свободного места на диске (натуральное число, не превышающее 10 000) и N— количество пользователей (натуральное число, не превышающее 4000). В следующих N строках находятся значения объёмов файлов каждого пользователя (все числа натуральные, не превышающие 100), каждое в отдельной строке. Запишите в ответе два числа: сначала наибольшее число пользователей, чьи файлы могут быть помещены в архив, затем максимальный размер имеющегося файла, который может быть сохранён в архиве, при условии, что сохранены файлы максимально возможного числа пользователей. Источник: ссылка |
В решении этой задачи мы сначала записываем свободное место в переменную, а затем сортируем массив с файлами по возрастанию. Начинаем заполнять массив пока место не закончится (оно гарантированно закончится раньше).
“Подводный камень” этой задачи заключается в том, что нужно сохранить наибольший размер файла, который можно сохранить при условии, что количество пользователей сохранится. Так как после записи последнего файла у нас останется некоторое место, кторое слишком мало, чтобы записать в него следующий. Тогда мы выкидываем из массива последний сохранённый файл и следующим массивом бежим от того, который мы выкинули, до того файла, размер которого не превысит свободное место. Он и будет самым большим при том, что количество пользователей, файлы которых удалось записать, останется прежним.
#Задание 26
#Читаем файл
f = open(r"/home/artyom/Downloads/26.txt", "r", encoding="utf-8")
mas = f.readlines()
f.close()
#Свободное место записано первым числом
#в первой строке (числа разделяет пробел)
free = int(mas[0].split(" ")[0])
#Выбрасываем эту первую строчку и
#перезаполняем массив уже ЦЕЛЫМИ
mas = [int(i) for i in mas[1:]]
mas.sort() #Сортируем
#Кол-во пользователей
i = 0
#Файл последнего пользователя
last = 0
while True:
#Если размер файла меньше свободного места
if free > mas[i]:
free -= mas[i]
i += 1
else:
free += mas[i]
last = mas[i]
break
print(i) #вывод кол-во пользователей
#Бежим от того последнего файла
for j in range(last, len(mas)):
#Если наткнулись на файл, который больше, чем осталось места
if free < mas[j]:
print(mas[j - 1]) #Сохраняем предыдущий
break