#include <iostream>
#include <algorithm>
#include <cstring>
#include <set>
using namespace std;
typedef pair<int, int> pii;
int main() {
int *tab;
int n;
set <pii> summTab;
cin >> n;
tab = new int[n+1];
memset(tab, 0, n+1);
//reading data and putting them into sets
for(int i=0; i<n; i++) {
int a;
cin >> a;
tab[a]++;
}
for(int i=0; i <= n; i++) {
if(tab[i] != 0) {
summTab.insert(pii(tab[i], i));
}
}
// running construcion
int splitCnt = 1; // we have one sequence at least
while(!summTab.empty()) {
pii longestEl = *summTab.rbegin();
summTab.erase(longestEl);
int topQty = longestEl.first;
while(!summTab.empty()) {
pii smallestEl = *summTab.begin();
summTab.erase(smallestEl);
int smallestQty = smallestEl.first;
if(smallestQty >= topQty) {
summTab.insert(pii(smallestQty - topQty + 1, smallestEl.second));
splitCnt++;
break;
}
topQty -= (smallestQty);
}
}
cout << splitCnt << endl;
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 | #include <iostream> #include <algorithm> #include <cstring> #include <set> using namespace std; typedef pair<int, int> pii; int main() { int *tab; int n; set <pii> summTab; cin >> n; tab = new int[n+1]; memset(tab, 0, n+1); //reading data and putting them into sets for(int i=0; i<n; i++) { int a; cin >> a; tab[a]++; } for(int i=0; i <= n; i++) { if(tab[i] != 0) { summTab.insert(pii(tab[i], i)); } } // running construcion int splitCnt = 1; // we have one sequence at least while(!summTab.empty()) { pii longestEl = *summTab.rbegin(); summTab.erase(longestEl); int topQty = longestEl.first; while(!summTab.empty()) { pii smallestEl = *summTab.begin(); summTab.erase(smallestEl); int smallestQty = smallestEl.first; if(smallestQty >= topQty) { summTab.insert(pii(smallestQty - topQty + 1, smallestEl.second)); splitCnt++; break; } topQty -= (smallestQty); } } cout << splitCnt << endl; return 0; } |
English