Коротко об исходных данных. Все просто:
- известен объём диска (первое число);
- известно количество пользователей, что хотят сохранить свои данные на диск (второе число).
Числовые данные нам представляются текстовым файлом. Их нужно перенести в документ Excel. Для этого открываем текстовый файл. Во вкладке “Правка” нажимаем команду “Выделить все” – все данные окрашиваются в синий цвет. Далее вновь заходим во вкладку “Правку”, но выбираем команду ” Копировать”. Переходим в документ Excel и в верхней левой ячейке вставляем скопированные данные (можно нажать на правую кнопку мыши и выбрать команду “вставить”).
Числа, попавшие в первую ячейку, показывают объем свободного места на диске (первое) и количество пользователей (второе число).
Все остальные числа показывают объем пользовательских файлов, каждому пользователю принадлежит один файл.
Логика рассуждения: чтобы сохранились данные максимального числа пользователей, то нужно выбрать файлы с меньшими объемами.
Так как для нас важны меньшие объемы, то и выстроим данные по этому признаку, для этого.
Для начала выгрузим файл в Excel-таблицу: выбираем вкладку “Данные”, слева видим “Из текстового/CSV-файла”.
Путь для тех, кто пока ни разу не программист, но есть хорошая математическая логика.
Составляем пошаговый алгоритм на русском языке для будущих шагов в Ecxel:
- копирую данные из текстового документа и вставляю их в Ecxel;
- переношу первую ячейку правее и ниже (не удаляю, эти данные будут нужны);
- сортирую столбец с объемами файлов по возрастанию;
- складываю последовательно ячейки;
- выбираю среди полученных сумм наибольшее значение, которое удовлетворяет условию задачи;
- определяю сколько файлов вошли в эту сумму; это первый ответ;
- нахожу разницу между заданным пределом и полученной в первой части задания суммой;
- если убрать из записи на диск файл с максимальным объемом, то его можно будет заменить на файл большего объема, который займет и его объем и оставшуюся разницу;
- определяю максимальный объем файла, который удалось записать на диск (результат А);
- сортирую по убыванию все файлы пользователей;
- так как второй вопрос задания о максимально возможном записанном файле заменяю результат А на перв и проверяю условие задачи, если выполняется, то это второй ответ, если не выполняется
Путь для тех, кто чуть-чуть освоил Питон.
Составляем пошаговый алгоритм на русском языке для Питона
- открой файл с документами, поработай со строками, в которых записаны числа:
- на языке Питон это выглядит так:
- f = open(‘название файла.txt’) (открывай этот файл)
- data = f.readlines() (работай со строками)
- s = data[0].split() (сообщаем Питону, что в первой строке записаны два отдельных числа)
- s = int(s[0]) (просим Питон запомнить первое число из первой строки – общий разрешенных объем на диске; второе число в решении нашего задания участие не принимает)
- на языке Питон это выглядит так:
- обязательно удаляем первую строку, для вычислений она не нужна:
- на языке Питон это выглядит так:
- del (data[0])
- на языке Питон это выглядит так:
- задаем границы нашего цикла (от первого до последнего значения)
- на языке Питон это выглядит так:
- for i in range(0, len(data)):
- data[i] = int(data[i])
- на языке Питон это выглядит так:
- для выполнения нашего цикла нам нужно отсортировать наши данные по возрастанию:
- на языке Питон это выглядит так:
- data = sorted(data)
- на языке Питон это выглядит так:
- задаем стартовое значение суммы: summa = 0;
- просим Питон считать количество файлов (count) до тех пор, пока сумма объемов не превысит предельного значения (s):
- на языке Питон это выглядит так?
- for count in range(0, len(data)):
- if summa + data[count] > s: break (если сумма больше, цикл закончен, выводим предыдущее значение на экран)
- summa += data[count]
- print(count)
- for count in range(0, len(data)):
- на языке Питон это выглядит так?
- вторая часть задания:
- определим разницу между допустимым пределом и суммой полученной в предыдущей части (d) и сравниваем ее с разницей между различными значениями объемов файлов, если разница между объемами меньше d, то выбираем наибольшее значение уменьшаемого и выводим его на экран:
- на языке Питон это выглядит так:
- d = s – summa
- for i in range(0, len(data)):
- if data[i] – data[count – 1] <= d:
- itog = data[i]
- print(itog)
- на языке Питон это выглядит так: