Znajdowanie lidera w przedziale!
Ostatnio zmodyfikowano 2014-06-08 21:21
| 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: 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ć. | 
|  | 
| pekfos | » 2014-06-08 20:58:22 | jakby ktoś chciał to mogę je wypisać. | 
 Jest coś mocniejszego, niż te nieszczęsne l ? | 
|  | 
| 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: 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? | 
|  | 
| pekfos | » 2014-06-08 21:19:41 | 
|  | 
| Gahaalt Temat założony przez niniejszego użytkownika | » 2014-06-08 21:21:03 Oczywiście, powinno być odwrotnie!Dziękuję :)
 | 
|  | 
| « 1 » |