Форум » Массивы, сортировка, работа с файлами » Задание 26, задача 42. Не сходится ответ. » Ответить

Задание 26, задача 42. Не сходится ответ.

check8386:

Ответов - 6

check8386: "Предприятие производит оптовую закупку изделий A и Z, на которую выделена определённая сумма денег. У поставщика есть в наличии партии этих изделий различных модификаций по различной цене. На выделенные деньги необходимо приобрести как можно больше изделий Z (независимо от модификации). Закупать можно любую часть каждой партии. Если у поставщика закончатся изделия Z, то на оставшиеся деньги необходимо приобрести как можно больше изделий A. Известна выделенная для закупки сумма, а также количество и цена различных модификаций данных изделий у поставщика. Необходимо определить, сколько будет закуплено изделий A и какая сумма останется неиспользованной. Входные данные представлены в файле 26-42.txt следующим образом. Первая строка входного файла содержит два целых числа: N – общее количество партий изделий у поставщика и S – сумма выделенных на закупку денег (в рублях). Каждая из следующих N строк описывает одну партию изделия: сначала записана буква A или Z (тип изделия), а затем – два целых числа: цена одного изделия в рублях и количество изделий в партии. Все данные в строках входного файла разделены одним пробелом. В ответе запишите два целых числа: сначала количество закупленных изделий типа A, затем оставшуюся неиспользованной сумму денег." Не совпадает второй ответ. Решение в EXCEL. Для изделий группы А осталось денег 1542858. Покупаем 7340 изделий на 1537581р, осталось 5277р. На них покупаем 13 изделий по 369р и 1 изделие по 479р. Всего изделий 7354, остался 1 р (в ответе 111р). Где у меня ошибка?

check8386: Ответ 111 получаем при покупке 14 изделий по 369 рублей. Требования потратить максимум денег в условии нет, поэтому верными являются оба ответа: 1 и 111. По-видимому, или условие, или ответ нуждаются в уточнении.

Поляков: Спасибо за замечание, я поправил условие.


amem151: можете подсказать, как решить это задание? Начало получается, но когда нужно найти количество А ничего не получается...

LE: Алгоритм решения (Эксель): 1. Так как необходимо приобрести как можно больше изделий Z рассчитаем стоимость всех партий изделий Z. Общая стоимость всех товаров Z = 2 457 142 На покупку товаров А осталось: 4 000 000 - 2 457 142 = 1 542 858 2. Далее будем работать только с товарами А. На оставшуюся сумму нам нужно купить как можно больше товаров А + оставшаяся сумма должна быть максимальна. Делаем для товаров А «настраиваемую» сортировку: - сортируем столбец В (цена) по возрастанию, т.к. чем дешевле товар тем больше мы можем его купить - сортируем столбец С (количество) по убыванию. Выясняем что «полных» партий товара А мы можем купить на сумму 1537581, при этом количество товаров А в этих «полых»* партиях будет = 7340 товаров. (Прим.: «полная»* партия – это когда выкуплены ВСЕ товары данной партии в полном объеме) Еще остается для покупки 1542858 – 1537581 = 5 277 рублей. На эту сумму мы можем купить несколько товаров по цене 369 рублей. А именно, можем купить по этой цене 14 товара А, т.к. 14*369 = 5 166 рублей и это чуть меньше нашего остатка на покупку. Итого: Купили товаров А: 7340 (в «полных» партиях) + 14 (товары по цене 369) = 7354 Осталось от покупки: 1542858 – 1537581 – 5166 = 111 (где 1 542 858 – сумма для покупки товаров А (осталась после покупки всех товаров Z); 1 537 581 – сумма при покупке «полных» партий товаров А)

Ванька: f = open('fail.txt') N, S = map(int, f.readline().split()) #читаем первую строку iz_z = [] iz_a = [] for i in range(N): t, pr, col = f.readline().split() #читаем каждую строку pr = int(pr) col = int(col) if t == 'A': iz_a.append([pr, col, pr*col]) else: iz_z.append([pr,col, pr*col]) for i in iz_z: #В этом цикле мы вычитаем из изначальной суммы цены всех партий Z S -= i[2] #заменяем название массива на "d" для удобства d = iz_a col = 0 d.sort(key=lambda x: (x[0], -x[1])) #Сортируем этот массив сначала по цене, потом по количеству ans = 0 for i in d: if S - i[2] >= 0: #Если это условие, то просто вичитаем цену партии S -= i[2] ans += i[1] else: #Если это условие, то вычитаем до тех пор, пока влазим в стоимость now_count = 0 while S > 0: now_count += 1 S -= i[0] #S - точно <= 0, поэтому мы точно либо уложились идеально, либо ушли на одно изделие в минус. #Данный цикл это учитывает if S != 0: S += i[0] ans += now_count-1 else: ans += now_count break print(ans, S)



полная версия страницы