Problem z czasem w programie

0

Witam przyszedłem tutaj, ponieważ mam problem z czasem w programie. Testerka wyświetla limit czasu. Zadanie polega na tym, że do zbiorników (jest ich N) wrzucane są beczki (jest ich M). Trzeba wypisać numer zbiornika i liczby napisane na beczkach podczas ich wyciągania (czyli odwrotnie od wpisywania). Użyłem tutaj stosów, ponieważ wydawały mi się najlepsze. Poniżej wkleję kod i zadanie.

Napisz program, który znając zawartość teczki znalezionej przez Jasia,
poda dla każdego zbiornika ciąg liczb, jaki powstanie przy wyciąganiu z niego beczek.
Wejście
N - liczba zbiorników (1 <= N <= 10^5)
M - liczba beczek (1 <= M <= 10^6)
W następnych M liniach po dwie liczby Xi, Yi,
odpowiednio liczba napisana na i-tej beczce (1 <= Xi <= 10^9)
i numer zbiornika, do którego trafi i-ta beczka (1 <= Yi <= N)

Wyjście
N lini, w i-tej linii napis "Zbiornik #i: " oraz ciąg oddzielonych spacjami liczb,
jakie byłyby odczytywane przy wyciąganiu kolejnych beczek z i-tego zbiornika.

Przykład
Dla danych wejściowych
3 7
12 2
5 1
100 1
37 3
1 2
2 1
23 2
poprawną odpowiedzią jest
Wyjście:
Zbiornik 1: 2 100 5
Zbiornik 2: 23 1 12
Zbiornik 3: 37

#include<iostream>
#include<stack>
#include<algorithm>
using namespace std;

int main()
{
    ios_base::sync_with_stdio(0);
    int n, m;
    cin >> n >> m;
    int tabx[m];
    int taby[m];
    stack <int> S;
    for(int i=0; i<m; i++)
    {
        cin>>tabx[i]>>taby[i];
    }
    for(int i=1; i<=n; i++)
    {
        for(int j=0; j<m; j++)
        {
            if(taby[j]==i)
            {
                S.push(tabx[j]);
            }

        }
        cout<<"Zbiornik "<<i<<": ";
        while(!S.empty())
        {
            cout<<S.top()<<" ";
            S.pop();
        }
        cout<<"\n";
    }
    return 0;
}
0

TREŚĆ:

W Górach Opatowskich znajdują się zbiorniki tajemniczego składnika X.
Codziennie o godzinie 5:00 jest dowożona beczka z napisaną na niej liczbą naturalną
i umieszczana w jednym z N zbiorników. Jaś w trakcie obozu informatycznego
przypadkiem natknął się w lesie na teczkę z informacją, że łącznie składowane będzie
M beczek oraz z informacją która beczka trafi do którego zbiornika.
Jaś w trakcie spaceru spostrzegł, że zbiorniki są głębokie i na tyle wąskie,
że po wrzuceniu do niego beczki ląduje ona na poprzednio wrzuconej beczce lub na dnie,
jeżeli do zbiornika nie wrzucono wcześniej żadnej beczki.
Jaś jest ciekaw, jaki ciąg liczb powstanie jeśli zaczniemy wyciągać beczki
z któregoś zbiornika i odczytywać liczby napisane na kolejnych beczkach.

Zadanie
Napisz program, który znając zawartość teczki znalezionej przez Jasia,
poda dla każdego zbiornika ciąg liczb, jaki powstanie przy wyciąganiu z niego beczek.

Wejście
N - liczba zbiorników (1 <= N <= 10^5)
M - liczba beczek (1 <= M <= 10^6)
W następnych M liniach po dwie liczby Xi, Yi,
odpowiednio liczba napisana na i-tej beczce (1 <= Xi <= 10^9)
i numer zbiornika, do którego trafi i-ta beczka (1 <= Yi <= N)

Wyjście
N lini, w i-tej linii napis "Zbiornik #i: " oraz ciąg oddzielonych spacjami liczb,
jakie byłyby odczytywane przy wyciąganiu kolejnych beczek z i-tego zbiornika.

Przykład
Dla danych wejściowych

3 7
12 2
5 1
100 1
37 3
1 2
2 1
23 2
poprawną odpowiedzią jest
Wyjście:
Zbiornik 1: 2 100 5
Zbiornik 2: 23 1 12
Zbiornik 3: 37

0

Po pierwsze:

int n, m;
    cin >> n >> m;
    int tabx[m];
    int taby[m];

tak nie możesz deklarować statycznych tablic, statyczne tablice muszą mieć rozmiar znany w czasie kompilacji, jak rozumiem jest to automatycznie testowane gdzieś, być może jest ustawiona flaga -Wpedantic i testy się nie puszczają jak jest kompilacja z warningami. Zamień to na std::vector.

0

Użyj tablicy lub lepiej jakiejś innej kolekcji dwuwymiarowej pierwszy wymiar niech reprezentuje zbiorniki a drugi wymiar niech reprezentuje beczki. I wtedy po prostu dodawaj do odpowiedniego wymiaru. Chyba najlepsza by była tablica/vector stosów.

    vector<stack<int>> zbiorniki(n);
    zbiorniki[Xi-1].push(Yi);

Taki, krótki kod tylko by pokazać ci o co mi chodzi nie rozwiązuje on twojego problemu ,ale powinien ci pomóc. Tak naprawdę liczba beczek jest ci zbędna przy użyciu stosu ,ale wczytać ją musisz by algorytm działał.

0
  1. Wczytujesz n i m
  2. Tworzysz std::vector<std::stack<int>> o rozmiarze n (ja nazwę ten obiekt buffer)
  3. Tworzysz pętle od 0 do m
    3.1. Wczytujesz x i y
    3.2. Do buffer[y - 1] push-ujesz x
  4. Tworzysz pętle od i = 0 do n
    4.1. Wypisujesz Zbiornik {i + 1}:
    4.2. Dopóki buffer[i] coś zawiera: wypisujesz jego zawartość wraz z znakiem spacji
    4.3. Wypisujesz znak nowej linij

1 użytkowników online, w tym zalogowanych: 0, gości: 1