@XRFD

В чём проблема в задании «Обработка пакетов через контейнер очередь»?

Условие :
Первая строка входа содержит размер буфера size и
число пакетов n. Каждая из следующих n строк содержит два
числа: время arrivali прибытия i-го пакета и время durationi
,
необходимое на его обработку. Гарантируется, что arrival1 ≤
arrival2 ≤ · · · ≤ arrivaln. При этом может оказаться, что
arrivali−1 = arrivali
. В таком случае считаем, что пакет i − 1 поступил раньше пакета i.
Формат выхода. Для каждого из n пакетов выведите время, когда
процессор начал его обрабатывать, или −1, если пакет был отброшен.
Ограничения. Все числа во входе целые. 1 ≤ size ≤ 105
; 0 ≤ n ≤ 105
;
0 ≤ arrivali ≤ 106
; 0 ≤ durationi ≤ 103
; arrivali ≤ arrivali+1 для всех
1 ≤ i ≤ n − 1.
Пример.
Вход:
1 0
Выход:
Если пакетов нет, выводить ничего не нужно.
Пример.
Вход:
1 1
0 0
Выход:
0
Пакет поступил в момент времени 0, и компьютер тут же начал
его обрабатывать. Но при выводе у меня получается вход 1 0 и выход пустое значение (Empty result) в Visual studio проверял код всё нормально а вот в стёпике ругается может скажите как дополнить код чтоб решить данную ошибку
#include <iostream>
#include <queue>
using namespace std;
 
int main() {
    int bufferSize, numPackets;
    cin >> bufferSize >> numPackets;
 
    queue<pair<int, int>> packets; // очередь пакетов
    int currentTime = 0; // текущее время
 
    for (int i = 0; i < numPackets; i++) {
        int arrival, duration;
        cin >> arrival >> duration;
 
        // Извлекаем из очереди пакеты, которые готовы к обработке
        while (!packets.empty() && packets.front().first <= currentTime - bufferSize) {
            cout << packets.front().second << endl;
            packets.pop();
        }
 
        if (packets.size() < bufferSize) {
            // Очередь не полна, добавляем пакет
            int startTime = max(currentTime, arrival); // время начала обработки пакета
            cout << startTime << endl;
            packets.push({startTime + duration, startTime});
        } else {
            // Очередь полна, пакет не может быть обработан
            cout << -1 << endl;
        }
 
        currentTime = arrival + duration; // обновляем текущее время
    }
 
    return 0;
}
  • Вопрос задан
  • 151 просмотр
Пригласить эксперта
Ответы на вопрос 1
Alexandroppolus
@Alexandroppolus
кодир
у тебя миллиард багов внутри цикла. Вот, с поправками:

queue<int> ends; // очередь окончаний
int startTime = 0; // возможный старт

for (int i = 0; i < numPackets; i++) {
        int arrival, duration;
        cin >> arrival >> duration;

       // выясняем, когда на самом деле можно стартовать пакет
       int realStart = max(startTime, arrival);
 
        // Извлекаем из очереди пакеты, которые обработаны на момент старта
        while (!ends.empty() && ends.front() <= arrival) {
            ends.pop();
        }
 
        if (ends.size() < bufferSize) {
            // если на момент старта есть места в очереди, стартуем
            cout << realStart << endl;
            startTime = realStart + duration; // окончание обработки
            ends.push(startTime);
        } else {
            // Очередь полна, пакет не может быть обработан
            cout << -1 << endl;
       }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы