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

Задача на Python (Задача сапожника)

20.04.2024, 10:20. Показов 847. Ответов 1

Студворк — интернет-сервис помощи студентам
Код и условия задачи представлены ниже. Проблема: код ничего не выводит. В чём ошибка?

У сапожника имеется N заказов от покупателей, которые он должен выполнить. Сапожник может заниматься в день только одним заказом, и заказы обычно требуют на выполнение несколько дней. Для i-го заказа целое число Ti
(1 ≤ Ti ≤ 1000) означает число дней, необходимых сапожнику для завершения заказа.
Но за популярность нужно платить. За каждый день задержки перед тем, как он приступит к работе над i-м заказом, сапожник согласился платить штраф в размере Si (1 ≤ Si ≤ 1000) центов в день. Помогите сапожнику, написав программу, находящую последовательность работ, ведущую к минимальному штрафу.

Входные данные
Входные данные начинаются со строки, содержащей одно положительное целое число, которое означает количество тестовых блоков, за которой следует пустая строка. Между двумя последовательными тестовыми блоками также находится пустая строка.
Первая строка каждого блока содержит целое число, задающее число заказов N, причем 1 ≤ N ≤ 1000. i-я последующая строка содержит время завершения Ti и ежедневный штраф Si для i-го заказа.

Выходные данные
Для каждого тестового блока ваша программа должна вывести последовательность заказов, ведущую к минимальному штрафу. Каждый заказ представляется своей позицией во входных данных. Все целые числа должны находиться на одной строке выходных данных и каждая пара чисел должна быть разделена одним пробелом. Если возможны несколько решений, выведите первое в лексикографическом порядке.
Выходные данные для двух последовательных блоков должны быть разделены пустой строкой.

Пример входных данных
1
4
3 4
1 1000
2 2
5 5

Соответствующие выходные данные
2 13 4 

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
47
48
49
50
51
52
53
54
def minimize_penalty(orders):
    # Сортировка заказов по двум критериям: штрафу и времени выполнения
    orders.sort(key=lambda x: (x[1], x[0]))
 
    min_penalty = float('inf')  # Начальное значение минимального штрафа
    result = []  # Результат, содержащий последовательность заказов
    current_penalty = 0  # Текущий штраф
 
    for i, (days, penalty) in enumerate(orders):
        current_penalty += days * penalty
        # Если текущий штраф меньше минимального, обновляем результат
        if current_penalty < min_penalty:
            min_penalty = current_penalty
            result = [i + 1]  # Обновляем результат с новым заказом
        # Если текущий штраф равен минимальному, добавляем заказ в результат
        elif current_penalty == min_penalty:
            result.append(i + 1)
 
    return result
 
 
# Чтение входных данных
def read_input():
    test_cases = int(input())
    input_data = []
 
    for _ in range(test_cases):
        _ = input()  # Пропускаем пустую строку
        n = int(input())  # Количество заказов
        orders = []
        for _ in range(n):
            days, penalty = map(int, input().split())
            orders.append((days, penalty))
        input_data.append((n, orders))
 
    return input_data
 
 
 
 
# Основная функция для обработки всех тестовых блоков
def main():
    input_data = read_input()
 
    for n, orders in input_data:
        result = minimize_penalty(orders)
        print(*result)
 
        if input_data.index((n, orders)) < len(input_data) - 1:
            print()  # Разделитель для следующего тестового блока
 
 
if __name__ == "__main__":
    main()
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.04.2024, 10:20
Ответы с готовыми решениями:

Задача на python
Распространенность (A) числа n определяется как: (сумма делителей числа n) / n Например: A(8) = (1 + 2 + 4 + 8) / 8 = 15/8 ...

Задача "проблема сапожника"
В некоей воинской части есть сапожник. Рабочий день сапожника длится N минут. Заведующий складом оценивает работу сапожника по количеству...

Задача про сапожника, не проходит тест
В некоей воинской части есть сапожник. Рабочий день сапожника длится n минут. Заведующий складом оценивает работу сапожника по количеству...

1
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
20.04.2024, 14:56
Лучший ответ Сообщение было отмечено Airadarey как решение

Решение

Airadarey,
Python
1
2
3
4
5
from functools import cmp_to_key
for _ in range(int(input())):
    w = [(*map(int, input().split()), k+1) for k in range(int(input()))]
    w.sort(key=cmp_to_key(lambda x, y: x[0]*y[1]-y[0]*x[1] or x[2]-y[2]))
    print(*(x[2] for x in w))
Добавлено через 6 минут
или так.. нужно тесты смотреть
Python
1
2
3
for _ in range(int(input())):
    w = [(*map(int, input().split()), k+1) for k in range(int(input()))]
    print(*(x[2] for x in sorted(w, key=lambda x: (x[0] / x[1], x[2]))))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.04.2024, 14:56
Помогаю со студенческими работами здесь

Задача на Python
Задача 1.3 (LCD-дисплей) Ваш друг только недавно купил себе новый компьютер. До этого самой мощной машиной, которую он когда-либо...

Задача Статистика python
Господа программисты помогите, пожалуйста, с решением задачи. Всё решение разумеется не прошу. Подскажите, пожалуйста, как взять данные из...

Задача на python по теме функции

Задача Python. Рекурсивные функции
Рекурсивно описать функцию divs(N) для подсчета количества всех делителей целого числа N (N&gt;1), без учета делителей 1 и N.

Python олимпиадная задача на граф
Формат входных данных В первой строке дано целое число t (1 ≤ t ≤ 10^4) — количество наборов входных данных. В первой строке каждого...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение/ Перевод https:/ / **********/ gallery/ thinkpad-x220-tablet-porn-gzoEAjs . . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru