Top.Mail.Ru
Ответы

Пытаюсь решить задачу про детский праздник с++ бинарный поиск у меня ошибка на 4 тесте

Сдать решение задачи J-Детский праздник
Ограничение времени: 1 с
Ограничение реального времени: 5 с
Ограничение памяти: 256M
Задача J: Детский праздник
Организаторы детского праздника планируют надуть для него
M
воздушных шариков. С этой целью они пригласили
N
добровольных помощников,
i
-й среди которых надувает шарик за
T
i
минут, однако каждый раз после надувания
Z
i
шариков устает и отдыхает
Y
i
минут. Теперь организаторы праздника хотят узнать, через какое время будут надуты все шарики при наиболее оптимальной работе помощников, и сколько шариков надует каждый из них. (Если помощник надул шарик, и должен отдохнуть, но больше шариков ему надувать не придется, то считается, что он закончил работу сразу после окончания надувания последнего шарика, а не после отдыха).

Формат входных данных
В первой строке входных данных задаются числа
M и N ( 0 ≤ M ≤ 15000 , 1 ≤ N ≤ 1000 ). Следующие N строк содержат по три целых числа — T i , Z i и Y
i соответственно ( 1 ≤ T i , Y i 100 ≤ i ≤ 1000 ).

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

#include <iostream>
#include <vector>
using namespace std;
int main() {
int m, n, c, l, r, k, o;
o = 0;
c = 0;
cin >> m >> n;
vector<int>t(n);
vector<int>z(n);
vector<int>y(n);
for (int i = 0; i < n; i++) {
cin >> t[i] >> z[i] >> y[i];
}
l = 0;
r = 1000000;
k = (l + r) / 2;
while (r - l > 1) {
c = 0;
k = (l + r) / 2;
for (int i = 0; i < n; i++) {
c += k / (t[i] * z[i] + y[i]) * z[i] + min(k % (t[i] * z[i] + y[i]) / t[i], z[i]);
}
if (c >= m) {
r = k;
} else {
l = k;
}
}
cout << k << endl;
for (int i = 0; i < n; i++) {
if (o + k / (t[i] * z[i] + y[i]) * z[i] + min(k % (t[i] * z[i] + y[i]) / t[i], z[i]) <= m) {
cout << k / (t[i] * z[i] + y[i]) * z[i] + min(k % (t[i] * z[i] + y[i]) / t[i], z[i]) << ' ';
o += k / (t[i] * z[i] + y[i]) * z[i] + min(k % (t[i] * z[i] + y[i]) / t[i], z[i]);
} else {
cout << m - o << ' ';
o = m;
}
}
return 0;
}

Дополнен

пожалуйста помогите с задачей

По дате
По рейтингу
Аватар пользователя
Ученик

import heapq

m,n = map(int, input().split())
t,z,y = map(list,zip(*[map(int, input().split()) for _ 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(next_time)

Аватар пользователя
Ученик

Так решите и потом приходите