Задача к ЕГЭ по информатике на тему «задачи под вебы» №4

Задача с сайта https://kpolyakov.spb.ru/

На закупку товаров типов Q  и Z  выделена определённая сумма денег. Эти товары есть в продаже по различной цене. Необходимо на выделенную сумму закупить как можно больше товаров двух типов (по общему количеству). Если можно разными способами купить максимальное количество двух товаров, то нужно выбрать способ, при котором будет закуплено как можно больше товаров типа Q  . Если при этих условиях есть несколько способов закупки, нужно потратить как можно меньше денег.

Определите, сколько будет закуплено товаров типа Q  и сколько денег останется.

Входные данные представлены в файле 26-62.txt следующим образом. Первая строка входного файла содержит два целых числа: N  – общее количество товаров и M  – сумма выделенных на закупку денег (в рублях). Каждая из следующих N  строк содержит целое число (цена товара в рублях) и символ (латинская буква Q  или Z  ), определяющий тип товара. Все данные в строках входного файла отделены одним пробелом.

Запишите в ответе два числа: сначала количество закупленных товаров типа Q  , затем оставшуюся неиспользованной сумму денег.

Пример входного файла:

6 110

40 Z

50 Q

50 Z

30 Z

20 Q

10 Z

В данном случае можно купить не более четырёх товаров, из них не более двух товаров типа Q  . Минимальная цена такой покупки 110 рублей (покупаем товары 10 Z  , 20 Q  , 30 Z  , 50 Q  ). Останется 0 рублей. Ответ: 2 0.

Решение в Excel:

Открываем файл в Excel  → Данные → Текст по столбцам с разделителями – точка с запятой.

Переносим значения из первой строки вправо и удаляем пустую строку.

Сортируем сначала по столбцу A  , потом по столбцу B  .

Далее, начиная с ячейки A1  , начинаем спускаться вниз, выделяя диапазон. В это время смотрим как меняется счетчик суммы в правом нижнем углу. Видим, что максимальное число товаров – 95 на сумму 99034, больше взять не можем, так как дальнейшие товары стоят больше, чем выделенная сумма денег.

Выделяем диапазон A1 : A95  внешними границами и сортируем его сначала по столбцу B  – «от Я до А», а затем по столбцу A  – «по убыванию». Выделяем ячейки ниже 95 строки, вырезаем и вставляем их в столбцы C  и D  .

Теперь сортируем этот кусок сначала по столбцу D  – «от А до Я», затем по столбцу C  – «по возрастанию».

В столбце E  будем считать сумму товаров, заменяя самые дорогие товары Z  из первых 95 товаров на самые дешевые товары Q  . В E1  запишем формулу:

= С УМ М (A$1 : A$95 )− A1+ C1

В ячейке E2  Запишем формулу:

= E1− A2 + C2

и растянем ее вниз, пока не увидим значение, превышающее 100000.

Последняя подходящая ячейка будет E27  с суммой товаров 99967. Оставшееся количество денег равно:

100000− 99967 = 33

.

Теперь считаем количество товаров Q  из столбца B  , их количество равно 41. Также нам подходят еще товары Q  из найденного выше диапазона C1 : C27  , количество которых равно 27. Значит, всего товаров типа Q  — 68.

textbfРешение в Python:

f= open(’26-62.txt’) # Открываем файл
n, m = map(int, f.readline().split()) # Kоличество товаров и суммa денег
a = []  # Список товаров
for i in f: # Добавление товаров в список ’a’
    s = i.split() # Разбиваем строку на цену и тип товара
    a.append([int(s[0]), s[1]]) # Добавляем товар
a.sort() # Сортируем список ’a’ по возрастанию цены
cart = [] # Корзина товаров для покупки
sm = 0 # Cтоимость выбранных товаров
while sm + a[0][0] <= m: # Пока стоимость товаров не превышает сумму ’m’
    cart.append(a.pop(0)) # Добавляем товар в корзину
    sm += cart[-1][0] # Увеличиваем общую стоимость
# Сортируем товары сначала по типу, затем по цене
a.sort(key=lambda x: [x[1], x[0]])
# Сортируем товары в корзине по типу (сначала Q, затем Z) и по цене
cart.sort(key=lambda x: [x[1], x[0]], reverse=True)

while True: # Меняем товары Z на Q
    if sm-cart[0][0]+a[0][0] > m: # Если стоимость превышает сумму ’m’
        break # Останавливаем цикл
    sm = sm-cart[0][0]+a[0][0] # Иначе изменяем сумму
    cart = cart[1:] # Убираем товар Z из корзины
    cart.append(a.pop(0)) # Добавляем в корзину товар Q
print(m - sm) # Остаток суммы
c = 0 # Cчетчик товаров Q
for i in cart: # Проверяем все товары в корзине
    if i[1] == ’Q’: # Если товар типа Q
        c += 1 # Увеличиваем счетчик
print(c) # Количество товаров типа Q

Ответ: 68 33
Оцените статью
Я решу все!