#include <bits/stdc++.h>
using namespace std;
const int MAX = 5e5+1;
int zlicz[MAX];
multiset<int> a;
int main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
int n;
cin >> n;
int x;
for(int i = 0; i < n; i++){
cin >> x;
zlicz[x]++;
}
for(int i = 1; i < MAX; i++){
if(zlicz[i] > 0){
a.insert(zlicz[i]);
}
}
int wynik = 0, ile, reszta;
while(!a.empty()){
wynik++;
ile = *a.rbegin();
a.erase(--a.end());
ile--;
while(ile > 0 && !a.empty())
{
if(*a.begin() <= ile){
ile -= *a.begin();
a.erase(a.begin());
}
else{
ile = 0;
reszta = *a.begin() - ile;
a.erase(a.begin());
a.insert(reszta);
}
}
}
cout << wynik;
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 | #include <bits/stdc++.h> using namespace std; const int MAX = 5e5+1; int zlicz[MAX]; multiset<int> a; int main(){ cin.tie(0); ios_base::sync_with_stdio(0); int n; cin >> n; int x; for(int i = 0; i < n; i++){ cin >> x; zlicz[x]++; } for(int i = 1; i < MAX; i++){ if(zlicz[i] > 0){ a.insert(zlicz[i]); } } int wynik = 0, ile, reszta; while(!a.empty()){ wynik++; ile = *a.rbegin(); a.erase(--a.end()); ile--; while(ile > 0 && !a.empty()) { if(*a.begin() <= ile){ ile -= *a.begin(); a.erase(a.begin()); } else{ ile = 0; reszta = *a.begin() - ile; a.erase(a.begin()); a.insert(reszta); } } } cout << wynik; return 0; } |
English