#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using vi = vector<int>;
using vl = vector<ll>;
using vb = vector<bool>;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using str = string;
#define all(a) a.begin(), a.end()
#define print(a) for (auto elem:a) cout<<elem<<' '; cout<<'\n'
#define segprep(b) resize(1<<((int)ceil(log2(b.size()))+1))
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int n;
cin>>n;
vi nums(n);
for (auto &i:nums) cin>>i;
vi cnt(n+1, 0);
for (auto &i:nums) cnt.at(i)++;
deque<int> counts; //occ, num
for (int i = 1; i <= n; i++){
if (cnt.at(i)) counts.push_back(cnt.at(i));
}
sort(all(counts), greater<int>());
int ans = 0;
while (!counts.empty()){
auto curr = counts.front();
ans++;
counts.pop_front();
if (counts.empty()) break;
int smol_sum = 0;
while(!counts.empty() && smol_sum+counts.back() < curr){
smol_sum += counts.back();
counts.pop_back();
}
if (!counts.empty()) counts.back() -= curr-smol_sum-1;
}
cout<<ans<<'\n';
}
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 | #include<bits/stdc++.h> using namespace std; using ll = long long; using ull = unsigned long long; using vi = vector<int>; using vl = vector<ll>; using vb = vector<bool>; using pii = pair<int, int>; using pll = pair<ll, ll>; using str = string; #define all(a) a.begin(), a.end() #define print(a) for (auto elem:a) cout<<elem<<' '; cout<<'\n' #define segprep(b) resize(1<<((int)ceil(log2(b.size()))+1)) int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n; cin>>n; vi nums(n); for (auto &i:nums) cin>>i; vi cnt(n+1, 0); for (auto &i:nums) cnt.at(i)++; deque<int> counts; //occ, num for (int i = 1; i <= n; i++){ if (cnt.at(i)) counts.push_back(cnt.at(i)); } sort(all(counts), greater<int>()); int ans = 0; while (!counts.empty()){ auto curr = counts.front(); ans++; counts.pop_front(); if (counts.empty()) break; int smol_sum = 0; while(!counts.empty() && smol_sum+counts.back() < curr){ smol_sum += counts.back(); counts.pop_back(); } if (!counts.empty()) counts.back() -= curr-smol_sum-1; } cout<<ans<<'\n'; } |
English