#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; } |
English