// Autor: Karol Kopczyński (KarixD) #include <iostream> #include <string> using namespace std; // Implementacja Algorytmu Quick Sort w C++ // Źródło: https://www.geeksforgeeks.org/cpp-program-for-quicksort/ int partition(int wszystkie_znaczki[], int start, int end) { int pivot = wszystkie_znaczki[start]; int count = 0; for (int i = start + 1; i <= end; i++) { if (wszystkie_znaczki[i] <= pivot) count++; } // Giving pivot element its correct position int pivotIndex = start + count; swap(wszystkie_znaczki[pivotIndex], wszystkie_znaczki[start]); // Sorting left and right parts of the pivot element int i = start, j = end; while (i < pivotIndex && j > pivotIndex) { while (wszystkie_znaczki[i] <= pivot) { i++; } while (wszystkie_znaczki[j] > pivot) { j--; } if (i < pivotIndex && j > pivotIndex) { swap(wszystkie_znaczki[i++], wszystkie_znaczki[j--]); } } return pivotIndex; } void quickSort(int wszystkie_znaczki[], int start, int end) { // base case if (start >= end) { return; } // partitioning the array int p = partition(wszystkie_znaczki, start, end); // Sorting the left part quickSort(wszystkie_znaczki, start, p - 1); // Sorting the right part quickSort(wszystkie_znaczki, p + 1, end); } int main() { // WPROWADZANIE DANYCH // wczytywanie ilości znaczków int ilosc_znaczkow; cin >> ilosc_znaczkow; // wczytywanie wszystkich numerów miast z których pochodzą znaczki string wejscie; cin.ignore(); getline (cin, wejscie); // podział wczytanego stringa na tablicę wczytanych miast z których pochodzą znaczki int wszystkie_znaczki[ilosc_znaczkow]; int numer_miasta = 0; int numer_cyfry = 0; string liczba = " "; for(int i=0;i<wejscie.length(); i++) { if(wejscie[i]==' ') { wszystkie_znaczki[numer_miasta] = stoi(liczba); numer_miasta++; liczba=" "; numer_cyfry = 0; } else { liczba[numer_cyfry] = wejscie[i]; numer_cyfry++; } } wszystkie_znaczki[numer_miasta] = stoi(liczba); // WŁAŚCIWY ALGORYTM // sortowanie tablicy z wprowadzonymi znaczkami quickSort(wszystkie_znaczki, 0, ilosc_znaczkow - 1); // policzenie powtórzeń w tablicy z wprowadzonymi znaczkami, czyli ilości miast int sprawdzany_znaczek; int ilosc_miast = 1; for(int i=0;i<ilosc_znaczkow-1; i++) { if(wszystkie_znaczki[i] != wszystkie_znaczki[i+1]) { ilosc_miast++; } } int ilosc_znaczkow_miasto[ilosc_miast]; // policzenie dla każdego miasta na ilu znaczkach się znajduje int sprawdzane_miasto = 0; ilosc_znaczkow_miasto[0]=1; for(int i=0;i<ilosc_znaczkow-1; i++) { if(wszystkie_znaczki[i] == wszystkie_znaczki[i+1]) { ilosc_znaczkow_miasto[sprawdzane_miasto]++; } else { sprawdzane_miasto++; ilosc_znaczkow_miasto[sprawdzane_miasto]=1; } } // podział znaczków int ilosc_rozdanych = 0; for(int i=1;i<ilosc_znaczkow+1; i++) { for(int j=0;j<ilosc_miast; j++) { if(ilosc_znaczkow_miasto[j]%i == 0) { ilosc_rozdanych+=ilosc_znaczkow_miasto[j]; } else { ilosc_rozdanych+=ilosc_znaczkow_miasto[j]-(ilosc_znaczkow_miasto[j]%i); } } cout << ilosc_rozdanych << " "; ilosc_rozdanych = 0; } return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | // Autor: Karol Kopczyński (KarixD) #include <iostream> #include <string> using namespace std; // Implementacja Algorytmu Quick Sort w C++ // Źródło: https://www.geeksforgeeks.org/cpp-program-for-quicksort/ int partition(int wszystkie_znaczki[], int start, int end) { int pivot = wszystkie_znaczki[start]; int count = 0; for (int i = start + 1; i <= end; i++) { if (wszystkie_znaczki[i] <= pivot) count++; } // Giving pivot element its correct position int pivotIndex = start + count; swap(wszystkie_znaczki[pivotIndex], wszystkie_znaczki[start]); // Sorting left and right parts of the pivot element int i = start, j = end; while (i < pivotIndex && j > pivotIndex) { while (wszystkie_znaczki[i] <= pivot) { i++; } while (wszystkie_znaczki[j] > pivot) { j--; } if (i < pivotIndex && j > pivotIndex) { swap(wszystkie_znaczki[i++], wszystkie_znaczki[j--]); } } return pivotIndex; } void quickSort(int wszystkie_znaczki[], int start, int end) { // base case if (start >= end) { return; } // partitioning the array int p = partition(wszystkie_znaczki, start, end); // Sorting the left part quickSort(wszystkie_znaczki, start, p - 1); // Sorting the right part quickSort(wszystkie_znaczki, p + 1, end); } int main() { // WPROWADZANIE DANYCH // wczytywanie ilości znaczków int ilosc_znaczkow; cin >> ilosc_znaczkow; // wczytywanie wszystkich numerów miast z których pochodzą znaczki string wejscie; cin.ignore(); getline (cin, wejscie); // podział wczytanego stringa na tablicę wczytanych miast z których pochodzą znaczki int wszystkie_znaczki[ilosc_znaczkow]; int numer_miasta = 0; int numer_cyfry = 0; string liczba = " "; for(int i=0;i<wejscie.length(); i++) { if(wejscie[i]==' ') { wszystkie_znaczki[numer_miasta] = stoi(liczba); numer_miasta++; liczba=" "; numer_cyfry = 0; } else { liczba[numer_cyfry] = wejscie[i]; numer_cyfry++; } } wszystkie_znaczki[numer_miasta] = stoi(liczba); // WŁAŚCIWY ALGORYTM // sortowanie tablicy z wprowadzonymi znaczkami quickSort(wszystkie_znaczki, 0, ilosc_znaczkow - 1); // policzenie powtórzeń w tablicy z wprowadzonymi znaczkami, czyli ilości miast int sprawdzany_znaczek; int ilosc_miast = 1; for(int i=0;i<ilosc_znaczkow-1; i++) { if(wszystkie_znaczki[i] != wszystkie_znaczki[i+1]) { ilosc_miast++; } } int ilosc_znaczkow_miasto[ilosc_miast]; // policzenie dla każdego miasta na ilu znaczkach się znajduje int sprawdzane_miasto = 0; ilosc_znaczkow_miasto[0]=1; for(int i=0;i<ilosc_znaczkow-1; i++) { if(wszystkie_znaczki[i] == wszystkie_znaczki[i+1]) { ilosc_znaczkow_miasto[sprawdzane_miasto]++; } else { sprawdzane_miasto++; ilosc_znaczkow_miasto[sprawdzane_miasto]=1; } } // podział znaczków int ilosc_rozdanych = 0; for(int i=1;i<ilosc_znaczkow+1; i++) { for(int j=0;j<ilosc_miast; j++) { if(ilosc_znaczkow_miasto[j]%i == 0) { ilosc_rozdanych+=ilosc_znaczkow_miasto[j]; } else { ilosc_rozdanych+=ilosc_znaczkow_miasto[j]-(ilosc_znaczkow_miasto[j]%i); } } cout << ilosc_rozdanych << " "; ilosc_rozdanych = 0; } return 0; } |