Zadanie AL_01_02 ze SPOJ-a – sędzia nie uznaje odpowiedni

0

Witam!
Napisałem program dla tego zadania: http://pl.spoj.com/problems/AL_01_02/
Mieści się on w ramach czasowych, dla podanych przeze mnie danych wejściowych zwraca poprawne wyniki, jednak sędzia twierdzi że odpowiedź jest błędna. Sam już nie wiem co może być w tym programie źle.
Poniżej wklejam kod. Dodam jeszcze że jestem dopiero na 16 odcinku kursu Mirosława Zelenta, dlatego zdaję sobie sprawę, że ten kod może być napisany chaotycznie.

#include <iostream>
#include <cstring>

using namespace std;

void kolejka(char* n, int wskaznik, char* tab, int &pozycja, int dl)
{
    int i=wskaznik; // wskaznik pokazuje miejsce od ktorego zaczynamy, a nastepnie miejsce wystepowania najsilniejszego zwierzecia
    char*w=&n[wskaznik];
    if(i<dl)
    {
        while(i<dl)
        {
            if(*w>n[wskaznik])
            {
                wskaznik=i; // ustalamy w jakiej pozycji tablicy znajduje sie najsilniejsze zwierze
            }
            if(*w=='z' || *w==tab[pozycja])
            {
                break; // dodalem te warunki, gdyz bez nich program przekracza limit czasu
            }
            i++;
            w++;
        }
        tab[pozycja]=n[wskaznik]; // po zakonczeniu petli wpisujemy do tablicy tab, litere oznaczajaca znalezione najsilniejsze zwierze i dodajemy do pozycji 1
        pozycja++;
        wskaznik++;
        kolejka(n,wskaznik,tab,pozycja,dl); // wywolujemy ta sama funkcje, tylko tym razem zaczynajac od miejsca w ktorym poprzednio bylo najsilniejsze zwierze + 1
    }
}

int main()
{
    int t; // liczba testow
    cin >> t;
    char *n; // tablica ze znakami
    char *tab; // tablica z ostateczna kolejka
    int ile = (10000000/t)+2;
    n = new char [ile];
    for(int i=0;i<t;i++)
    {
        tab = new char [ile];
        cin >> n;
        int pozycja=0; // pozycja do ktorej aktualnie zapisujemy litere w tablicy tab
        int dlugosc = strlen( n );
        kolejka(n,0,tab,pozycja,dlugosc);
        for(int j=0;j<pozycja;j++)
            cout << tab[j];
        cout << endl;
        delete [] tab;
    }
    delete [] n;
    return 0;
}

Ogólnie zamysł programu jest taki, że ma wyszukać pozycję, na której znajduje się najsilniejsze zwierze i wpisze je do tablicy z kolejką. Jako że po wystąpieniu najsilniejszego zwierzęcia wszystkie przed nim uciekły, to kolejne wywołanie funkcji zaczynamy od pozycji tego zwierzęcia+1 i wyszukujemy kolejne najsilniejsze zwierze w tym mniejszym zbiorze. Być może jest jakiś przypadek dla którego to nie działa, ale nie udało mi się jeszcze takiego znaleźć.

0

Tamten kod jest nieczytelny.

Możesz to rozwiązać w taki sposób.

  1. Zamień literki zwierzaków na liczby odpowiadające ich sile (tak by dało się jednoznacznie stwierdzić kto jest pierwszy).
  2. Stwórz pary (siła, indeks), gdzie indeks to miejsce zwierzaka w tablicy wejściowej.
  3. Posortuj pary (siła, indeks) malejąco po sile, rosnąco po indeksach.
  4. Przeiteruj po posortowanych parach: wypisuj zwierzaka (zamień jego siłę na literę) jeżeli jego indeks jest większy od największego indeksu jaki do tej pory widziałeś. Przy każdym obrocie iteracji uaktualniaj największy indeks.
0

Co do siły, to "kodowanie" zwierząt odpowiada ASCII, więc można bez obaw porównywać litery przez <>=.

0

za duzo kombinujesz, masz tu w c zeby ogarnac algorytm - raczej latwo to sobie na c++ przerobisz :)

#include <stdio.h>

int main(void) {
    int testy, ostatniaPozycja;
    char zwierzak, kolejka[1000001];
    scanf("%d", &testy);
    while(testy-- > 0)
    {
        while((zwierzak = getchar()) < 'A');
        ostatniaPozycja = -1;
        do {
            while(ostatniaPozycja >= 0 && zwierzak > kolejka[ostatniaPozycja]) ostatniaPozycja--;
            kolejka[++ostatniaPozycja] = zwierzak; 
        } while((zwierzak = getchar()) >= 'A');
        kolejka[ostatniaPozycja+1] = 0;
        printf("%s\n", kolejka);
    }
    return 0;
}

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