Algorytm do zliczania wystąpień liczb w dwóch tablicach

Algorytm do zliczania wystąpień liczb w dwóch tablicach
Ursinus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 161
0

Witam.
Piszę program: http://ideone.com/oMvuPs -treść zadania
i mam zagwozdkę bo nie wiem jak zrobić to zliczanie wystąpień liczb w zbiorach reprezentujących dany pomysł.
Przechowuję je (tzn. te zbiory liczb) jako tablice, które należą do poszczególnych elementów/pomysłów wrzucanych na stos/listę.
Nie wiem czy to dobry pomysł. Może ktoś z was zna lepszy i wie jak ten problem rozwiązać?
Jeśli wiecie co tu zrobić to będę wdzięczny za pomoc.
Pozdrawiam i wszystkiego dobrego w nowym roku.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
1
Kopiuj
unsigned CNT[10]={};
unsigned N,V=0;
for(cin>>N;N--;++CNT[V]) cin>>V;
Ursinus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 161
0

Ok dzięki, ale przydałoby się małe wytłumaczenie :) Bo jeśli chodzi ci o wczytywanie to wiem jak zrobić.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Tu masz od razu wczytywanie i zliczanie wystąpień.

Ursinus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 161
0

Czyli co? Zliczać wystąpienia każdej liczby, zapisywać je do pomysłu i potem przy wywołaniu funkcji która te pomysły wyszukuje i porównuje używać tych zliczonych wartości?

hauleth
  • Rejestracja: dni
  • Ostatnio: dni
1

@_13th_Dragon dał niezłą siekierę dla początkujących więc może rozpiszę co i jak:

W C i C++ zmienne na stercie, które nie są inicjalizowane mają wartość losową.
W C i C++ tablice można inicjalizować przy pomocy {} (ale tylko inicjalizować, potem to już nie działa).
Jeśli w {} jest mniej elementów niż rozmiar tablicy, to nadmiarowe elementy są uzupełniane 0.

To tłumaczy nam 1 linijkę:

<code=c++>unsigned CNT[10]={};

Kopiuj

2 linijka nie wymaga chyba tłumaczenia.

Pętla `for` może być również zapisana przy pomocy pętli `while` w taki sposób:
```cpp
for (a; b; c) { d; }

// to to samo co

a;
while (b) {
  d;
  c;
}

Przy czym zarówno while jak i for wykonują się tak długo jak warunek jest prawdziwy.

Operator postfiksowy -- oznacza, że chcemy zmniejszyć wartość danej zmiennej o 1 i uzyskać wartość zmiennej PRZED zmniejszeniem.

Teraz składając wszystko do kupy nasza pętla wygląda tak:

Kopiuj
cin >> N;
while (N--) {
  cin >> V;
  ++CNT[V];
}

Czyli:

  1. Wczytujemy liczbę testów
  2. N razy wykonujemy pętlę
  3. Wczytujemy liczbę
  4. Zwiększamy wartość komórki w tablicy CNT odpowiadającej wczytanej liczbie
_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0
Kopiuj
unsigned stan[10],idea[10];
unsigned more=0;
for(unsigned i=0;i<10;++i) more+=(stan[i]<idea[i]);
if(more>=3) // pasuje
Ursinus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 161
0

Czyli rozumiem, że mam mieć 2 tablice. Jedną do przechowywania liczb opisujących pomysł, a druga do ilości wystąpień danej liczby?
Jak na razie to mam tak kod napisany, że każdy pomysł ma tablicę z tymi liczbami które go opisują i jakoś zamierzałem je porównywać, ale rzeczywiście można by 2 tablice robić.

_13th_Dragon
  • Rejestracja: dni
  • Ostatnio: dni
0

Nie, zawsze trzymasz tylko ilości wystąpień. Jedna tablica jako stan oraz po jednej tablice przy każdym pomyśle.

Ursinus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 161
0

Ok dzięki Dragon. Teraz już chyba zrozumiałem. Dałeś mi praktycznie gotowy kod. Mam nadzieję, że po zaimplementowaniu w moim programie (jeśli niczego nie sknocę) zadziała.

Ursinus
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 161
0

http://ideone.com/8dKts7 - to jest kod tego zadania.
Możecie mi sprawdzić dlaczego nie działa poprawnie?
Zalicza tylko jeden test na 8 i tyle. Visual studio kompiluję ale jak wprowadzam dane to czasem przerywa działanie programu i pieje coś z przepinaniem last->next na NULL.
Błagam was pomóżcie.

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.