Обсуждение участника:Georgii Nigmatulin — различия между версиями

Материал из DISCOPAL
Перейти к: навигация, поиск
(Новая страница: «from operator import itemgetter # Just for 1 test. Give a list of list to function. [[], [], [], []] def find_optimal(orders): orders.sort(key=itemgetter(3)…»)
 
(Полностью удалено содержимое страницы)
 
Строка 1: Строка 1:
from operator import itemgetter
 
  
 
# Just for 1 test. Give a list of list to function. [[], [], [], []]
 
def find_optimal(orders):
 
    orders.sort(key=itemgetter(3), reverse=True)
 
 
    start_finish = list()
 
    work_volume = list()
 
    prices = list()
 
 
    for order in orders:
 
        start_finish.append(order[0])
 
        start_finish.append(order[2])
 
        work_volume.append(order[1])
 
        prices.append(order[3])
 
 
    start_finish = [x - min(start_finish) for x in start_finish]
 
 
    # array of busy sequence
 
    time_is_busy = [0] * (max(start_finish) + 1)  # list with indicators: the day is empty for task?
 
    # time_is_busy = [x+5 for x in range(max(start_finish)+1)]
 
 
    # array of deadlines
 
    starts = start_finish[0::2]
 
    deadlines = start_finish[1::2]
 
 
    penalty = 0
 
 
    for num_order in range(len(orders)):
 
 
        # Choosing the last day before deadline, when cheff can cook
 
        deadline_index = deadlines[num_order]
 
 
        flag_abort = 0
 
        if time_is_busy[deadline_index] != 0:
 
            while (deadline_index > starts[num_order]) and (deadline_index >= 0):
 
                if time_is_busy[deadline_index] == 0:
 
                    time_is_busy[deadline_index] = 10
 
                    flag_abort = 1
 
                    break
 
                deadline_index = deadline_index - 1
 
 
        # How many dishes can a chef cook before the deadline, but from the start?
 
        for work in range(1, work_volume[num_order] + 1):
 
            if (time_is_busy[deadline_index - work] == 0) and ((deadline_index - work >= starts[num_order])):
 
                time_is_busy[deadline_index - work] += 1
 
            else:
 
                work = work - 1
 
                break
 
        # print(f"In order No. {num_order+1}, {work + flag_abort} out of {work_volume[num_order]} dishes were prepared, each for {prices[num_order]} dollars. Penalty is {(work_volume[num_order] - work -flag_abort)*prices[num_order]}")
 
        penalty = penalty + (work_volume[num_order] - work - flag_abort) * prices[num_order]
 
 
    return penalty
 
 
 
t = int(input())
 
 
results = list()
 
 
for test in range(t):
 
 
    all_orders_of_test = list()
 
    count_of_orders = int(input())
 
 
    for order in range(count_of_orders):
 
        all_orders_of_test.append([int(num) for num in input().split(' ')])
 
 
    results.append(find_optimal(all_orders_of_test))
 
 
[print(x) for x in results]
 

Текущая версия на 10:15, 22 октября 2021