#include <iostream>
using namespace std;
int* counts;
int* keys;
int n;
void heapify(int i, int N) {
int maxIndex = i;
int left = 2 * i + 1, right = 2 * i + 2;
if (left < N && counts[keys[maxIndex]] < counts[keys[left]] ) maxIndex = left;
if (right < N && counts[keys[maxIndex]] < counts[keys[right]] ) maxIndex = right;
if (maxIndex != i) {
swap(keys[maxIndex], keys[i]);
heapify(maxIndex, N);
}
}
void heapSort() {
for (int i = n / 2 - 1; i >= 0; i--) heapify(i, n);
for (int i = n - 1; i >= 0; i--) {
swap(keys[0], keys[i]);
heapify(0, i); //Notice, that the size of heap decreases each iteration
}
}
int main()
{
cin >> n;
counts = new int[n + 1];
keys = new int[n + 1];
for(int i = 0; i <= n; i++){
keys[i] = i;
}
std::fill(counts, counts + n + 1, 0);
int input;
for (int i = 0; i < n; i++){
cin >> input;
counts[input]++;
}
n++;
heapSort();
n--;
int res = 1;
int numsToArrs = 0;
int leftNums = n;
for (int i = n; i > 0; i--){
leftNums -= counts[keys[i]];
if (counts[keys[i]] > leftNums - numsToArrs){
break;
}
else{
res++;
numsToArrs += (counts[keys[i]] - 1);
}
}
cout << res;
delete [] counts;
delete [] keys;
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 | #include <iostream> using namespace std; int* counts; int* keys; int n; void heapify(int i, int N) { int maxIndex = i; int left = 2 * i + 1, right = 2 * i + 2; if (left < N && counts[keys[maxIndex]] < counts[keys[left]] ) maxIndex = left; if (right < N && counts[keys[maxIndex]] < counts[keys[right]] ) maxIndex = right; if (maxIndex != i) { swap(keys[maxIndex], keys[i]); heapify(maxIndex, N); } } void heapSort() { for (int i = n / 2 - 1; i >= 0; i--) heapify(i, n); for (int i = n - 1; i >= 0; i--) { swap(keys[0], keys[i]); heapify(0, i); //Notice, that the size of heap decreases each iteration } } int main() { cin >> n; counts = new int[n + 1]; keys = new int[n + 1]; for(int i = 0; i <= n; i++){ keys[i] = i; } std::fill(counts, counts + n + 1, 0); int input; for (int i = 0; i < n; i++){ cin >> input; counts[input]++; } n++; heapSort(); n--; int res = 1; int numsToArrs = 0; int leftNums = n; for (int i = n; i > 0; i--){ leftNums -= counts[keys[i]]; if (counts[keys[i]] > leftNums - numsToArrs){ break; } else{ res++; numsToArrs += (counts[keys[i]] - 1); } } cout << res; delete [] counts; delete [] keys; return 0; } |
English