Sprawdazanie ile razy liczba występuje

0

Na przykład.

Wprowadzone przez użytkownika: 5 (ilość liczb)

Wprowadzone przez użytkownika: 2 2 3 3 3

Wyświetlane przez programy: Dobrze!


Wprowadzone przez użytkownika: 5 (ilość liczb)

Wprowadzone przez użytkownika: 2 2 4 4 4

Wyświetlane przez programy: 4 musi wystąpić 4 razy

Następnie program musi pokazać minimalną ilość liczb, które musi zmienić, aby zgadzało się ze stwierdzeniem (Np. 1 musi występować jeden raz, 2 dwa razy, 3 trzy razy, itd.)

Proszę pomóżcie.

#include <string>
using namespace std;

int main()
	{
	
		int n;
		string a;
		
		cin >> n;
		cin >> a;
		
		int alength = a.length();
		for( int i = 0; i < alength; ++i )
		{
    		char cvalue = a[i];
    		if( cvalue == ' ' )
        	continue;
    
		}
	}

Nie wiem czy ten kod jest dobry

2

Kod ten nie jest dobry, gdyż (m.in.) nic nie wypisuje. Ma też ten problem, że się nie kompiluje.

0

Jest jakieś ograniczenie co do zakresu liczb wprowadzanych przez użytkownika? Bo nie wiem czynie trzeba będzie w mapę iść jak będą mogły być duże.

0
sig napisał(a):

Jest jakieś ograniczenie co do zakresu liczb wprowadzanych przez użytkownika? Bo nie wiem czynie trzeba będzie w mapę iść jak będą mogły być duże.

Max 2000

0

Czyli tablica powinna starczyć. Tak przy okazji, ilość 6 i liczby 2 2 2 4 4 4 to będzie jedna zmiana czy dwie? w końcu z 2 starczy zrobić 4 będzie dobrze, ale w przykładzie który podałeś wcześniej trzeba dołożyć liczbę a nie zmieniać ją.

0
sig napisał(a):

Czyli tablica powinna starczyć. Tak przy okazji, ilość 6 i liczby 2 2 2 4 4 4 to będzie jedna zmiana czy dwie? w końcu z 2 starczy zrobić 4 będzie dobrze, ale w przykładzie który podałeś wcześniej trzeba dołożyć liczbę a nie zmieniać ją.

Przepraszam, ale źle wytłumaczyłem. Masz rację trzeba zmienić liczbę, a nie dodać. I w tym przypadku będzie jedna zmiana 2 na 4

0

To co w takim razie z drugim przykładem? Tam nie ma czego na 4 zmienić. Co do samego problemu, to zrób tablicę wypełnioną zerami, i zamień wczytywanie stringa na int-y, cin będzie "wiedział" że spacja je rozdziela, i wczyta osobno. Potem zwiększ o jeden wartość tablicy o wczytanym indeksie, i sprawdź ją na końcu.

0
sig napisał(a):

To co w takim razie z drugim przykładem? Tam nie ma czego na 4 zmienić. Co do samego problemu, to zrób tablicę wypełnioną zerami, i zamień wczytywanie stringa na int-y, cin będzie "wiedział" że spacja je rozdziela, i wczyta osobno. Potem zwiększ o jeden wartość tablicy o wczytanym indeksie, i sprawdź ją na końcu.

W drugim przykładzie zmieniasz jedną 2 na 1, a drugą 2 na 4. Czy proszę mógłbyś mi wytłumaczyć to co napisałeś, ale jako kod bo nie rozumiem.

0

Rozwiązaniem Bracie jest std::map<int, int> occurrences; gdzie kluczem jest liczba, a wartością ilość jej powtórzeń. Po zakończeniu wprowadzania bierzesz iterator begin(), i aż do end() sprawdzasz, czy iterator.key == iterator.value.
Inkrementację wartości przeprowadzisz poprzez non const referencję do wartości jaką daje np. map[key]

0
MasterBLB napisał(a):

Rozwiązaniem Bracie jest std::map<int, int> occurrences; gdzie kluczem jest liczba, a wartością ilość jej powtórzeń. Po zakończeniu wprowadzania bierzesz iterator begin(), i aż do end() sprawdzasz, czy iterator.key == iterator.value.
Inkrementację wartości przeprowadzisz poprzez non const referencję do wartości jaką daje np. map[key]

Ja właśnie nie widzę tego rozwiązania. Dla takich danych:

2 2 8 8 8 8 8 8

jak chcesz tutaj stwierdzić, które liczby na co pozamieniać, by tych zamian wyszło najmniej? Bo najtaniej jest zamienić dwójki na ósemki, a nie ósemki na szóstki.

0

Bo to, co piszę dotyczy zapamiętywania ilości powtórzeń Bracie @enedil. Jak uwzględnić opisaną sytuację:

  • wpierw nastąpi wykrycie przypadku iterator.key != iterator.value, tutaj key = 8 a value = 6
  • odejmując od key value otrzyma się, ile jeszcze dodatkowo musi wystąpić powtórzeń dla danego klucza - wyjdzie 2
  • ponadto aby algorytm miał sens, to przed zmianą stringa trzeba się upewnić, że string.size <= key
  • szukamy w stringu 2 pierwszych liczb nie będących 8, i podmieniamy je na 8

To dopiero szkic rozwiązania, trzeba by rozkminić bardziej złożone przypadki, jak np:
1 2 2 3 3 3 4 4 4

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