Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/47: Рейтинг темы: голосов - 47, средняя оценка - 4.66
3 / 2 / 1
Регистрация: 27.09.2020
Сообщений: 16

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

27.04.2022, 02:46. Показов 9884. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Предприятие производит закупку изделий A и B, на которую выделена определённая сумма денег. У поставщика есть в наличии различные модификации этих изделий по различной цене. При покупке необходимо руководствоваться следующими правилами:

1. Нужно купить как можно больше изделий, независимо от их типа и модификации.
2. Если можно разными способами купить максимальное количество изделий, нужно выбрать тот способ, при котором будет куплено как можно больше изделий B.
3. Если можно разными способами купить максимальное количество изделий с одинаковым количеством изделий B, нужно выбрать тот способ, при котором вся покупка будет дешевле.

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

Входные данные.
Первая строка входного файла содержит два целых числа: N — общее количество изделий у поставщика и M — сумма выделенных на закупку денег (в рублях). Каждая из следующих N строк содержит целое число (цена изделия в рублях) и символ (латинская буква A или B), определяющий тип изделия. Все данные в строках входного файла отделены одним пробелом.

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

Пример входного файла:
6 130
30 A
50 A
60 B
20 B
70 B
10 A

В данном случае можно купить не более 4 изделий, из них не более 2 изделий B. Минимальная цена такой покупки 120 рублей (покупаем изделия 30A, 60B, 20B, 10A). Останется 10 рублей. В ответе надо записать числа 2 и 10.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
with open('26.txt') as f:
    N, M = map(int, f.readline().split())  # N -кол-во M —деньги
    goods = list()
    for line in f:
        a, b = line.split()
        goods.append(tuple([int(a), b]))
    goods = sorted(sorted(goods, key=lambda x: x[1], reverse=True), key=lambda x: x[0])
    """
    Товары отсортированы в первую очередь по цене от меньшего к большему
    во вторую очередь по модификации, В перед А
    """
    i = 0  # курсор товара
    a_goods = []  # деньги потраченные на каждый товар A
    count = 0  # счетчик B Товаров
    while M >= goods[i][0]:  # если хватает денег
        if goods[i][1] == 'B':
            count += 1  # подсчет купленных В товаров
            print(f'Покупаем товар В за {goods[i][0]}. всего куплено {count}. {count + len(a_goods)}')
        else:
            a_goods.append(goods[i][0])  # деньги потраченные на каждый товар А
            print(f'Покупаем товар A за {goods[i][0]}. всего куплено {len(a_goods)}. {count + len(a_goods)}')
        M -= goods[i][0]  # списываем деньги
        i += 1  # курсор на следующий товар
    print()
    print(f'стоимость следующего товара {goods[i][0]}. Баланс {M}')
    print()
    a_goods = list(reversed(a_goods))
    for s in a_goods:  # s - стоимость самого дорогого из оставшихся товаров
        if M+s >= goods[i][0]:  # если денег все еще хватает на i товар, жертвуя самым дорогим А товаром
            if goods[i][1] == 'B':  # если i товар является В товаром
                M = M + s - goods[i][0]
                count += 1
                print(f'03.xlsx всего куплено {count}')
            i += 1  # рассматриваем следущий товар
        else:
            break  # если не хватает средств, прерываем цикл
    print(count, M)
не могу прикрепить файл с данными, но ответ неверный.
мой код неправильно считает кол-во В товаров (150 против 154 в ответах)
принты можете стереть
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.04.2022, 02:46
Ответы с готовыми решениями:

Вывести, сколько и каких обедов будет куплено, и сколько учеников останется голодными
Задание: Известно количество денег у каждого из N учеников, а также стоимость 4 комплексных обедов в школьной столовой. Напечатать...

Определить, сколько и каких обедов будет куплено, и сколько учеников останется голодными
здравствуйте , помогите пожалуйста с задачей в задаче использовать 2 массива( 1- деньги учеников , 2- стоимость обедов(сортировать по...

Какая сумма будет подарена на каждый день рождения до совершеннолетия? Сколько всего денег будет подарено?
мой богатый дядюшка подарил мне доллар на день рождения. в каждый следующий день рождения он удваивал свой подарок и прибавлял к нему...

5
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
27.04.2022, 12:27
Лучший ответ Сообщение было отмечено Koshsky как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
def create_basket(goods, N, money):
    #на вход товары по возрастанию цены, кол-во товаров, кол-во денег
    # на выходе кол-во товаров В и остаток денег
    
    a_goods = list(filter(lambda x: x[1] == 'A', goods))
    b_goods = list(filter(lambda x: x[1] == 'B', goods))
    size, a_size, b_size, v_money = 0, 0, 0, money
 
    #определяем максимальное кол-во товаров, которое можем купить
    for g in goods:
        if v_money >= g[0]:
            size += 1
            v_money -= g[0]
        else: break
            
    #если можем купить все товары        
        if size == N:
            return (len(b_goods), v_money)
    
    #заполняем корзину товарами B
    for g in b_goods:
        if money >= g[0]:
            b_size += 1
            money -= g[0]
        else: break
            
    #пока не достигнем нужного размера, добавляем товары А
    #удаляя самый дорогой товар В если закончились деньги       
    while (b_size + a_size < size):
        if money >= a_goods[a_size]:
            money -= a_goods[a_size]
            a_size += 1
        else:
            size_b -= 1
            money += b[size_b]
    
    return (b_size, money)
 
print (create_basket(goods, N, M))
Добавлено через 12 минут
В конце функции в цикле while остались переменные из прошлой жизни
Правильно
Python
1
2
3
4
5
6
7
8
    
    while (b_size + a_size < size):
        if money >= a_goods[a_size]:
            money -= a_goods[a_size]
            a_size += 1
        else:
            b_size-= 1
            money += b_goods[b_size]
Добавлено через 17 минут
Да, блин. Опять не все поменял
Вот сейчас точно
Python
1
2
3
4
5
6
7
    while (b_size + a_size < size):
        if money >= a_goods[a_size][0]:
            money -= a_goods[a_size][0]
            a_size += 1
        else:
            b_size-= 1
            money += b_goods[b_size][0]
0
3 / 2 / 1
Регистрация: 27.09.2020
Сообщений: 16
27.04.2022, 19:37  [ТС]
Модифицировал код в соответствии с заданием
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def create_basket(goods, N, money):
    #на вход товары по возрастанию цены, кол-во товаров, кол-во денег
    # на выходе кол-во товаров В и остаток денег
    
    a_goods = list(filter(lambda x: x[1] == 'A', goods))
    b_goods = list(filter(lambda x: x[1] == 'B', goods))
    size, a_size, b_size, v_money = 0, 0, 0, money
 
    #определяем максимальное кол-во товаров, которое можем купить
    for g in goods:
        if v_money >= g[0]:
            size += 1
            v_money -= g[0]
        else: break
            
    #если можем купить все товары        
        if size == N:
            return (len(b_goods), v_money)
    
    #заполняем корзину товарами B
    for g in b_goods:
        if money >= g[0]:
            b_size += 1
            money -= g[0]
        else: break
            
    #пока не достигнем нужного размера, добавляем товары А
    #удаляя самый дорогой товар В если закончились деньги       
    while (b_size + a_size < size):
        if money >= a_goods[a_size][0]:
            money -= a_goods[a_size][0]
            a_size += 1
        else:
            b_size-= 1
            money += b_goods[b_size][0]
    return [b_size, money]
 
goods = []
with open('26.txt') as f:
    N, M = map(int, f.readline().split())
    for line in f:
        a, b = line.split()
        goods.append([int(a), b])
    goods.sort(key=lambda x: x[0])
 
print(create_basket(goods, N, M))
алгоритм работает без ошибок, большое спасибо
но есть пару замечаний:
1. неудачное название переменной, содержащей информацию о количестве товаров. size это не кол-во. из-за этого не мог понять что да как
2. ваша функция ничего не возвращает
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
28.04.2022, 06:41
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
n, m = map( int, input( 'n, m = ' ).split() )
goods = []
for i in range(n):
    price, type = input('-> ').split()
    goods.append( ( int(price), type ) )
goods.sort( key=lambda x: ( x[0], x[1]=='A' ) )
a_list = []
b_list = []
count  = 0
for i in range(n):
    if m - goods[i][0] >= 0:
        m -= goods[i][0]
        count += 1
        if goods[i][1] == 'A':
            a_list = [ goods[i] ] + a_list
    else:
        if goods[i][1] == 'B':
            b_list.append(goods[i])
            if len(b_list) == len(a_list):
                break
b_count = count - len(a_list)
for a, b in zip( a_list, b_list ):
    if m - ( b[0] - a[0] ) >= 0:
        m -= ( b[0] - a[0] )
        b_count += 1
    else:
        break
print( b_count, m )
0
Эксперт Python
 Аватар для Red white socks
4523 / 1899 / 336
Регистрация: 18.01.2021
Сообщений: 3,489
28.04.2022, 07:30
Цитата Сообщение от Koshsky Посмотреть сообщение
size это не кол-во. из-за этого не мог понять что да как
size - это размер корзины. в штуках.
Цитата Сообщение от Koshsky Посмотреть сообщение
ваша функция ничего не возвращает
в смысле??
0
3750 / 1944 / 612
Регистрация: 21.11.2021
Сообщений: 3,707
28.04.2022, 13:13
Еще вариант:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
n, m = map( int, input( 'n, m = ' ).split() )
goods = []
for i in range(n):
    price, type = input('-> ').split()
    goods.append( ( int(price), type ) )
goods.sort( key=lambda x: ( x[0], x[1]=='A' ) )
a_list      = []
b_new_count = 0
count       = 0
for i in range(n):
    if m - goods[i][0] >= 0:
        m -= goods[i][0]
        if goods[i][1] == 'A':
            a_list = [ goods[i] ] + a_list
        count += 1
    else:
        if b_new_count >= len(a_list):
            break
        if goods[i][1] == 'B':
            if m - ( goods[i][0] - a_list[b_new_count][0] ) < 0:
                break
            m -= goods[i][0] - a_list[b_new_count][0]
            b_new_count += 1
print( count - len(a_list) + b_new_count, m )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
28.04.2022, 13:13
Помогаю со студенческими работами здесь

Сколько пар высшего сорта скорее всего будет среди 75 изделий, поступивших с фабрики?
31% продукции обувной фабрики составляют изделия высшего сорта. Сколько пар высшего сорта скорее всего будет среди 75 изделий, поступивших...

Сколько всего соли останется в сосуде через 20 мин?
Добрый вечер. Помогите, пожалуйста, в решении данной задачи. В сосуде 100 л чистой воды. В сосуд втекает солевой раствор концентрацией...

Определить сколько веников будет произведено и какое количество не бракованных хворостин останется не использованными
Фирма вяжет веники. Запасы хворостин исчисляются числом N &gt;1000. На один веник уходит m хворостин. Примерно, каждая k-я хворостина...

Определить для каждой категории ювелирных изделий, сколько магазинов продают его дешевле всего...
В ювелирных магазинах продаются изделия четырёх категорий A, B, C и D. В городе N был проведен мониторинг цен ювелирных изделий в различных...

Сумма денег S в банке под процентом T. Какая будет сумма через 1, 2, 3, 4, 5 лет?
Помогите((( сума денег S в банку под процентом T. Какая будет сума через 1, 2, 3, 4, 5, лет?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru