Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/40: Рейтинг темы: голосов - 40, средняя оценка - 4.78
0 / 0 / 0
Регистрация: 19.10.2022
Сообщений: 6
1

Детский праздник и шарики

13.12.2022, 01:13. Показов 7177. Ответов 9

Author24 — интернет-сервис помощи студентам
Организаторы детского праздника планируют надуть для него m воздушных шариков. С этой целью они пригласили n добровольных помощников, i-й среди которых надувает шарик за ti минут, однако каждый раз после надувания zi шариков устает и отдыхает yi минут. Теперь организаторы праздника хотят узнать, через какое время будут надуты все шарики при наиболее оптимальной работе помощников, и сколько шариков надует каждый из них. (Если помощник надул шарик, и должен отдохнуть, но больше шариков ему надувать не придется, то считается, что он закончил работу сразу после окончания надувания последнего шарика, а не после отдыха).

Входные данные
В первой строке входных данных задаются числа m и n (0≤m≤15000,1≤n≤1000). Следующие n строк содержат по три целых числа — ti, zi и yi соответственно (1≤ti,yi≤100,1≤zi≤1000).

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

Пример
входные данные
1 2
2 1 1
1 1 2

выходные данные
1
0 1

Не получается решить, прохожу сейчас курс на кф, но эта задача поставила в тупик(
https://codeforces.com/edu/cou... ?locale=ru
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2022, 01:13
Ответы с готовыми решениями:

Детский праздник
Есть задача. Какова будет реализация? Организаторы детского праздника планируют надуть для него...

Задача про шарики. Узнать за какое минимальное время будут надуты все шарики
Школьный бал Во время проведения школьного бала планируется запустить m одинаковых воздушных...

Завод производит шарики для подшипников. Бракуются шарики, диаметр которых отличается от стандарта на 0,1 мм. Найти дисп
Завод производит шарики для подшипников. Бракуются шарики, диаметр которых отличается от стандарта...

Определить, какого цвета шарики есть хотя бы у одного ребенка и есть ли одинаковые шарики хотя бы у двух детей
На детском празднике каждому ребенку был подарен воздушный шарик ("с" — синий, "г" — голубой, "з" —...

9
Эксперт Python
4264 / 1815 / 330
Регистрация: 18.01.2021
Сообщений: 3,376
13.12.2022, 09:41 2
В алгоритме ничего сложного нет: вы отдаете следующий шарик тому, кто надует его быстрее.
Вам понадобится массив времен надутия следующего шарика и счетчик. Изначально в массиве - t_i, в счетчике нули. Выбираете минимальное t_i из массива, инкрементируете счетчик и добавляете ко времени t_i, а если значение в счетчике делится на z_i, то еще и дополнительно y_i.
Проходите цикл m раз, в счетчике будет ответ.
Сложность - O(mn). Для данных ограничений плюсы или ява укладываются в секунду не напрягаясь, а вот питон со скрипом.
Но можно вместо массива использовать кучу. Она здесь идеально подходит. Тогда сложность будет O(m*log n) и с задачей справится и питон.
2
0 / 0 / 0
Регистрация: 19.10.2022
Сообщений: 6
13.12.2022, 21:11  [ТС] 3
Спасибо большое, попробую!
0
0 / 0 / 0
Регистрация: 19.10.2022
Сообщений: 6
17.12.2022, 10:18  [ТС] 4
Red white socks, Добрый день, насколько поняла, вы имеете в виду что-то такое? как заставить это работать.....(прошу не бить, только месяц на питоне):

Python
1
2
3
4
5
6
7
8
9
10
11
m, n = map(int, input().split())
t, z, y = map(int, input().split())
time = [[] for i in range(t)]
count = 0
 
for j in range(m):
    count =+ min(t[j])
    if count // z[j] == 0:
        count =+ y[j]
 
print(count)
0
Эксперт Python
4264 / 1815 / 330
Регистрация: 18.01.2021
Сообщений: 3,376
17.12.2022, 13:56 5
Maria_con, начать надо с того, чтобы верно собрать данные.
Цитата Сообщение от Maria_con Посмотреть сообщение
Следующие n строк содержат по три целых числа — ti, zi и yi
Добавлено через 4 минуты
Должно получиться 3 массива: t, z, y. Можно также собрать в массив data размером n x 3, где t, z, y будут его столбцами. Как вам удобнее
0
Status 418
Эксперт Python
4581 / 2348 / 602
Регистрация: 26.11.2017
Сообщений: 5,264
Записей в блоге: 3
17.12.2022, 15:33 6
Maria_con, почитайте что такое "жадный алгоритм"
0
Эксперт Python
4264 / 1815 / 330
Регистрация: 18.01.2021
Сообщений: 3,376
17.12.2022, 15:45 7
Лучший ответ Сообщение было отмечено Maria_con как решение

Решение

eaa, да тут не в понимании понятия (алгоритм я рассосал, как мог) а в слабом владении инструментария)

Добавлено через 5 минут
Пора на ДР собираться, вот вам подарок в качестве хорошего настроения

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from random import randint, seed
from time import time
 
seed(42)
start = time()
 
m,n = 15000,1000
#t,z,y = map(list,zip(*[map(int, input().split()) for _ in range(n)]))
t,z,y = map(list,zip(*[[randint(1,100) for i in range(3)] for j in range(n)]))
 
counter = [0]*n
times = t[:]
for _ in range(m):
    i,next_time = min(enumerate(times), key = lambda x: x[1])
    counter[i] += 1
    times[i] += t[i] + y[i]*(counter[i]%z[i]==0)
    
print(f'Время расчета {time()-start:.3f}c')
print(next_time)
print(*counter[:10])
Код
Время расчета 1.357c
368
4 3 12 26 5 6 28 5 5 4
Добавлено через 2 минуты
А теперь возможности кучи:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from random import randint, seed
from time import time
import heapq
 
seed(42)
start = time()
 
m,n = 15000,1000
#t,z,y = map(list,zip(*[map(int, input().split()) for _ in range(n)]))
t,z,y = map(list,zip(*[[randint(1,100) for i in range(3)] for j in range(n)]))
 
counter = [0]*n
times = list(zip(t,range(n)))
heapq.heapify(times)
for _ in range(m):
    next_time, i = heapq.heappop(times)
    counter[i] += 1
    heapq.heappush(times, (next_time + t[i] + y[i]*(counter[i]%z[i]==0), i))
    
print(f'Время расчета {time()-start:.3f}c')
print(next_time)
print(*counter[:10])
Код
Время расчета 0.028c
368
4 3 12 26 5 6 28 5 5 4
2
0 / 0 / 0
Регистрация: 19.10.2022
Сообщений: 6
17.12.2022, 16:04  [ТС] 8
Спасибо большое!
0
Status 418
Эксперт Python
4581 / 2348 / 602
Регистрация: 26.11.2017
Сообщений: 5,264
Записей в блоге: 3
17.12.2022, 16:44 9
еще бин.поиском можно решать эту задачу.
1
Эксперт Python
4264 / 1815 / 330
Регистрация: 18.01.2021
Сообщений: 3,376
17.12.2022, 17:20 10
Цитата Сообщение от eaa Посмотреть сообщение
еще бин.поиском можно решать эту задачу
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from random import randint, seed
from time import time
from bisect import insort_left
 
seed(42)
start = time()
 
m,n = 15000,1000
#t,z,y = map(list,zip(*[map(int, input().split()) for _ in range(n)]))
t,z,y = map(list,zip(*[[randint(1,100) for i in range(3)] for j in range(n)]))
 
t = list(map(lambda x: -x, t))
counter = [0]*n
times = sorted(list(zip(t,range(n))))
for _ in range(m):
    next_time, i = times.pop()
    counter[i] += 1
    insort_left(times, (next_time + t[i] - y[i]*(counter[i]%z[i]==0),i))
    
print(f'Время расчета {time()-start:.3f}c')
print(-next_time)
print(*counter[:10])
Код
Время расчета 0.042c
368
4 3 12 26 5 6 28 5 5 4
Добавлено через 8 минут
Куча немного впереди, потому что помимо двоичного поиска требуется и "медленный" сдвиг при вставке.
1
17.12.2022, 17:20
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.12.2022, 17:20
Помогаю со студенческими работами здесь

Ура! Праздник!
Сегодня наконец произошло то, чего я ждал 3 года: у меня с первого раза установилась Microsoft...

Что за праздник?
Просто: СССР за годы ВМВ потеряло 42 млм. Рейх - 7.5. Кто кого победил? Где сегодня ветеран из...

Профессиональный праздник...
Как то, на очередной вечеринке, собрались мы и подумали, а почему, собственно, у программистов нет...

Завтра праздник
Колеги по оружие, с наступающим что ли...

Праздник Ивана Купала
блин, такой праздник пропустил ( В ночь на 7 июля на Трухановом острове в Киеве прошло...

Праздник к нам приходит
Доброго времени суток, леди и джентельмены, дамы и господа, сэры и серихи. У меня встал вопрос,...

Проверка дня на праздник
Проверить вводимую дату: если совпадёт с одним из праздников - поздравить. Помогите написать...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru