Zadanie krążki szkopuł

0

Witam,
ostatnio próbowałam rozwiązać zadanie ze
szkopuła

#include <stack>
#include <iostream>

using namespace std;
int licz;
int tab[2000005];
int n,m,k, l;
stack<int>liczba;

int main()
{
cin>>n>>m;

for (int i=0;i<n;i++)
{
cin>>l;
if (i>0){
if(l>liczba.top())
{l=liczba.top();}}
liczba.push(l);
}

for (int i=0;i<m;i++)
{
cin>>tab[i];}

for (int i=0;i<m;i++){
if(liczba.empty()){
    cout<<0;
    return 0;}
 else{
if(tab[i]>liczba.top())
{
while(tab[i]>liczba.top())
{
liczba.pop();}
if(liczba.empty())
{break;}
}
if(tab[i]<=liczba.top())
{
    liczba.pop(); 
}}
}

if(liczba.empty())
cout<<0;
else
cout<<liczba.size()+1;
    return 0;
}

powyższy kod niestety przekracza limit czasu i w drugim teście wstępnym jest błąd wykonania.
Czy mógłby mi ktoś doradzić, jak poprawić kod?

1

W pierwszej kolejności to formatowanie, bo ciężko odczytać, co się tutaj dzieje. W drugiej złożoność, bo to na oko jest O(m^2), a przy liczbie 300 000 elementów rozwiązanie powinno być góra O(mlogm).

1

@szatkus1 - to co piszesz (tak podejrzewam, bo nie chciało mi się analizować kodu) pewnie jest sensowne i poprawne.
Ale mam 2 uwagi:

  1. piszesz do osoby początkującej, myślę, że Milena za bardzo nie ma pojęcia o co chodzi z tą złożonością
  2. nawet jakby zrozumiała co chciałeś przekazać - to jest porada na zasadzie mechanika, który powie "silnik źle pracuje". Takie ogólne hasło, bez konkretów. Dobrze by było, jakbyś pokazał gdzie konkretnie można coś poprawić, w czym jest problem, dlaczego złożoność wygląda tak, jak podałeś, jak to zmienić itp. Powtarzam - piszesz do osoby początkującej, więc tutaj raczej trzeba dawać więcej konkretów, lepiej naprowadzić, potrzymać za rączkę - bo wątpię w to, żeby sama wpadła na pomysł, jak to usprawnić.
1

Cześć Siostro w Kodzie Mileno

Po pierwsze, poświęć chwilę na porządne sformatowanie kodu.
Po drugie, wskazane jest, dla własnej wygody nawet, oznaczyć sobie komentarzami sekcji kodu w stylu "Pobieranie ilości klocków" itp.
Po trzecie, co do samego rozwiązania - tego typu zadania w głównej mierze polegają na tym, aby NIE SPRAWDZAĆ calutkiego pojemnika za każdym razem, trzeba podejść do zagadnienia sprytniej.

Oto, jakie triki nasuwają mi się na myśl jak czytam treść zadania

  1. Jak spadający klocek się gdzieś zatrzyma oznacza to, że to jest aktualny maks głębokości do której dotrze kolejny klocek, choćby najmniejszy.
  2. Klocek, choćby o najmniejszej średnicy, blokuje bezpośrednio nad sobą kolejny klocek -> czyli jeśli w przykładzie zamiast klocków 3, 2, 5 były 3, 2, 1, to ten 1 byłby maks głębokością dla kolejnego.
  3. Trzeba pamiętać o sytuacji, kiedy rurka ma postać pękatego wazonu z wąską szyjką, albo stożkowatego, by się nie wkopać na minę polegającą na sprawdzaniu od dna czy dany klocek się zmieści.

To na razie tyle Siostro.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.