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

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.

1
unsigned CNT[10]={};
unsigned N,V=0;
for(cin>>N;N--;++CNT[V]) cin>>V;
0

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

0

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

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?

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]={};


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:

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
0
unsigned stan[10],idea[10];
unsigned more=0;
for(unsigned i=0;i<10;++i) more+=(stan[i]<idea[i]);
if(more>=3) // pasuje
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ć.

0

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

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.

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.

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