AL_01_02 - Kolejka - przekroczono limit czasu

0

Witam.
Rozwiązuję zadanie ze SPOJ'a, które znajdziecie pod tym linkiem: http://pl.spoj.com/problems/AL_01_02/
Mój kod prezentuje się następująco:

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int ile;
    char tablica [1000000];

    cin >> ile;
    for (int i=0; i<ile; i++)
    {
        cin >> tablica;
        int  IleZnakow = strlen(tablica);

        for (int a = IleZnakow; a > 0; a--)
        {
            for (int b = 0; b <= IleZnakow; b++)
            {
                for (int x = b + 1; x <= IleZnakow; x++)
                {
                    if (tablica [b] < tablica [x])
                    {
                        tablica [b] = tablica [x];
                        tablica [x] = 0;
                    }
                }
            }
        }
        for (int q = 0; q < IleZnakow; q++)
        {
            cout << tablica [q];
        }
    }
    return 0;
}

Wynik jest (najprawdopodobniej) prawidłowy, lecz problem jest z czasem wykonania. Jak zoptymalizować ten program?

1

Nawet dla testowych danych dostajesz zły wynik.

0

Wiem, że dla testowych też mam źle, ale prosiłbym o jakąś małą wskazówkę co do tego kodu, czy w ogóle idę dobrym tokiem rozumowania, jakoś mnie naprowadzić.

#include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int ile;
    char tablica [1000000];

    cin >> ile;
    for (int i=0; i<ile; i++)
    {
        cin >> tablica;
        int  IleZnakow = strlen(tablica);

        for (int b = 0; b < IleZnakow; b++)
        {
            for (int x = IleZnakow - 1; x >= 0; x--)
            {
                if (tablica [b] < tablica [x])
                {
                    tablica [b] = tablica [x];
                    tablica [x] = 0;
                }
            }
        }

        for (int q = 0; q < IleZnakow; q++)
        {
            cout << tablica [q];
        }
        cout << endl;
    }
    return 0;
}
0

Tutaj jest działający kod, który (jakżeby inaczej) przekracza limit czasowy:

 #include <iostream>
#include <cstring>

using namespace std;

int main()
{
    int ile;
    char tablica[ 1000000 ];
   
    cin >> ile;
    for( int i = 0; i < ile; i++ )
    {
        cin >> tablica;
        int IleZnakow = strlen( tablica );
       
        for( int b = IleZnakow - 1; b > 0; b-- )
        {
            if( tablica[ b ] > tablica[ b - 1 ] )
            {
                tablica[ b - 1 ] = tablica[ b ];
                tablica[ b ] = 0;
            }
        }
       
        for( int q = 0; q < IleZnakow; q++ )
        {
            cout << tablica[ q ];
        }
        cout << endl;
    }
    return 0;
}
0

@Lich555 ten kod wcale nie działa a przynajmniej na pewno nie poprawnie. W ogóle nie bierzesz pod uwagę faktu że kolejka robi sie mniejsza niż początkowa liczba zwierząt i zawsze wypisujesz IleZnakow elementów tablicy. To że dasz w tablicy NULLe akurat niczego nie zmienia bo to też są znaki.
Poza tym silniejsze zwierze eliminuje wszystkie słabsze zwierzęta z końca kolejki a u ciebie tylko jedno.
Generalnie nic tu nie jest dobrze.

0

Dobrym pomysłem byłoby zamienienie tablicy na string?

0

Zacznij od zamiany algorytmu na liniowy.

  1. Zapoznaj się z dekrementacją bo jej nie rozumiesz: http://4programmers.net/Forum/1101404
  2. Nie używaj innego niż angielskie nazewnictwa: http://4programmers.net/Forum/1208091
  3. Ponieważ może się stać że musisz pominąć kilka elementów napisu to potrzebujesz dwa iteratora.
  4. Może coś w stylu:
#include <iostream>
#include <iomanip>
#include <cstring>
using namespace std;

int main()
  {
   ios::sync_with_stdio(false);
   cin.tie(0);
   static char buff[10000001]; // 10^6+'\0'
   unsigned T;
   for(cin>>T>>ws;T--;)
     {
      cin.getline(buff,sizeof(buff));
      char *ptr=strchr(buff,0),*i=ptr,last='A';
      while(i>buff) if(*(--i)>=last) *(--ptr)=last=*i;
      cout<<ptr<<'\n';
     }
   return 0;   
  }

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