#include<bits/stdc++.h> using namespace std; int t[1000005], z[1000005], n, wyn; multiset<int> S; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for(int i = 0; i < n; i++) { cin >> t[i]; z[t[i]]++; } for(int i = 1; i <= n; i++) if(z[i] != 0) S.insert(z[i]); while(!S.empty()) { if(S.size() == 1) { wyn++; break; } auto y = S.end(); y--; int nax = *y; S.erase(y); int k = nax - 1; int dol = 0; while(dol < k && S.size() > 0) { auto x = S.begin(); int nin = *x; if(nin + dol <= k) { S.erase(x); dol += nin; } else { S.erase(x); nin -= k - dol; S.insert(nin); break; } } wyn++; } cout << wyn; }
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 | #include<bits/stdc++.h> using namespace std; int t[1000005], z[1000005], n, wyn; multiset<int> S; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for(int i = 0; i < n; i++) { cin >> t[i]; z[t[i]]++; } for(int i = 1; i <= n; i++) if(z[i] != 0) S.insert(z[i]); while(!S.empty()) { if(S.size() == 1) { wyn++; break; } auto y = S.end(); y--; int nax = *y; S.erase(y); int k = nax - 1; int dol = 0; while(dol < k && S.size() > 0) { auto x = S.begin(); int nin = *x; if(nin + dol <= k) { S.erase(x); dol += nin; } else { S.erase(x); nin -= k - dol; S.insert(nin); break; } } wyn++; } cout << wyn; } |