Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Znajdowanie lidera w przedziale!

Ostatnio zmodyfikowano 2014-06-08 21:21
Autor Wiadomość
Gahaalt
Temat założony przez niniejszego użytkownika
Znajdowanie lidera w przedziale!
» 2014-06-08 20:41:52
Próbuję napisać prosty kodzik znajdowania lidera w wybranym przez użytkownika przedziale danej tablicy.

Wygląda to tak:

C/C++
int lider( int tab[], int beg, int end )
{
    int l, c = 1, licznik;
   
    for( licznik = beg; licznik < end; licznik++ )
    {
       
        if( c == 0 ) { tab[ licznik ] = l; c++; }
        else
             if( tab[ licznik ] == l ) c++;
        else c--;
       
        licznik++;
    }
   
    if( c == 0 ) return 0;
    else
    {
        c = 0;
        for( licznik = beg - 1; licznik < end; licznik++ ) if( tab[ licznik ] == l ) c++;
       
        if( c > end - beg + 1 ) return l;
       
    }
   
}


int main()
{
    int tab[] = { 3, 3, 4, 3, 1, 3 };
    int beg, end;
   
    cin >> beg >> end;
    cout << lider( tab, beg, end );
}


Niestety program zwraca złą wartość.

Działa na podstawie standardowego algorytmu wyszukiwania lidera w zbiorze. Ktoś wie w czym tkwi problem?



Edit: Inkrementowałem wartość licznika, którą inkrementowała dodatkowo pętla for. Niezły błąd ;)
Ale program wciąż nie działa..


Edit2: Tyle błędów to ja jeszcze nigdy nie natworzyłem. Wszystko już działa, wątpię żeby kogoś to interesowało. Błędy pewnie sami zauważycie, jakby ktoś chciał to mogę je wypisać.
P-111753
pekfos
» 2014-06-08 20:58:22
jakby ktoś chciał to mogę je wypisać.
Jest coś mocniejszego, niż te nieszczęsne l?
P-111757
Gahaalt
Temat założony przez niniejszego użytkownika
» 2014-06-08 21:17:38
Błędy typowo składniowe.

Nie nadałem początkowej wartości l.
Przy końcowym sprawdzaniu czy liczba jest liderem, sprawdzałem czy licznik jest większy od (end-beg+1), kiedy powinno to być (end-beg+1)/2.
Użyłem pętli for, która wykona powtórzenie nawet jeśli przedział będzie, np. od 2 do 2. Pętla while nadaje się w tym przypadku lepiej.


W każdym razie po skorygowaniu problemu i małym rozszerzeniu programu pojawił się kolejny problem.

Wprowadzam do programu tablicę (w moim przypadku 1 1 3 2 3 4 3), a program widzi ją dokładnie jako (1 1 3 2 1 4 1). Nie mam zielonego pojęcia dlaczego!

kod:
C/C++
int lider( int tab[], int beg, int end )
{
    int l = tab[ beg - 1 ], c = 1, licznik = beg;
   
    while( licznik < end )
    {
       
        if( c == 0 ) { tab[ licznik ] = l; c++; }
        else
             if( tab[ licznik ] == l ) c++;
        else c--;
       
        licznik++;
    }
   
    if( c == 0 ) return 0;
    else
    {
        c = 0;
        licznik = beg - 1;
        while( licznik < end ) { if( tab[ licznik ] == l ) c++; licznik++; }
       
        if( c >( end - beg + 1 ) / 2 ) return l;
        else return 0;
       
    }
   
}


int main()
{
    int n, m;
    cin >> n;
    cin >> m;
    int tab[ n ];
    for( int licz = 0; licz < n; licz++ ) { cin >> tab[ licz ]; }
    int beg, end;
    for( int licz = 0; licz < m; licz++ )
    {
        cin >> beg >> end;
        cout << lider( tab, beg, end ) << "\n";
    }
}


Problem był tylko chwilowy xD

Nagle ustąpiło, a nic nie zmieniałem. Dlaczego dzieją się takie dziwactwa?
P-111760
pekfos
» 2014-06-08 21:19:41
C/C++
tab[ licznik ] = l;
Może przez to?
P-111761
Gahaalt
Temat założony przez niniejszego użytkownika
» 2014-06-08 21:21:03
Oczywiście, powinno być odwrotnie!
Dziękuję :)
P-111763
« 1 »
  Strona 1 z 1