#include <cstdio> #include <algorithm> #include <vector> #define DEBUG false using namespace std; vector<int> ciag, lider; struct Lid{ int a; int ile; }lid[500000]; int n,x,nLid=0; int main(){ scanf("%d",&n); for(int i=0; i<n; i++){ scanf("%d",&x); ciag.push_back(x); } ciag.push_back(0); sort(ciag.begin(),ciag.begin()+n); for(int i = 0; i < n; i++){ x = 1; while( (i < n-1) && (ciag[i] == ciag[i+1]) ) { x++; i++; } lider.push_back(x); nLid++; } sort(lider.begin(),lider.end()); int last = lider[0]; int counter = 0; int al = 0; for(int i=0; i<nLid; i++){ if(last == lider[i]) counter++; else{ lid[al].a = last; lid[al].ile = counter; counter = 1; al++; last = lider[i]; } if(DEBUG)printf("%d ",lider[i]); } lid[al].a = last; lid[al++].ile = counter; if(DEBUG)printf("\n"); if(DEBUG)for(int i=0; i<al; i++){ printf("%d - %d\n",lid[i].a,lid[i].ile); } int a,p=0; int suma = 0; for(a = al-1; a>p; ){ if( lid[a].ile * (lid[a].a-1) <= lid[p].ile * lid[p].a){ lid[p].ile -= lid[a].ile * (lid[a].a-1); suma += lid[a].ile; a--; if(DEBUG)printf("suma:%d lidp:%d\n",suma,lid[p].ile); } else { suma += lid[p].ile * lid[p].a; lid[a].ile -= lid[p].ile * (lid[a].a-1); p++; if(DEBUG)printf("pyk:%d suma:%d %d\n",p,suma,lid[a].ile); } } int rest = lid[a].ile * lid[a].a; int sub = lid[a].a + (lid[a].a-1); while(rest >= sub ){ rest -= sub; suma ++; } if(rest>0) suma++; printf("%d\n",suma); 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 68 69 70 71 72 73 74 75 76 77 78 | #include <cstdio> #include <algorithm> #include <vector> #define DEBUG false using namespace std; vector<int> ciag, lider; struct Lid{ int a; int ile; }lid[500000]; int n,x,nLid=0; int main(){ scanf("%d",&n); for(int i=0; i<n; i++){ scanf("%d",&x); ciag.push_back(x); } ciag.push_back(0); sort(ciag.begin(),ciag.begin()+n); for(int i = 0; i < n; i++){ x = 1; while( (i < n-1) && (ciag[i] == ciag[i+1]) ) { x++; i++; } lider.push_back(x); nLid++; } sort(lider.begin(),lider.end()); int last = lider[0]; int counter = 0; int al = 0; for(int i=0; i<nLid; i++){ if(last == lider[i]) counter++; else{ lid[al].a = last; lid[al].ile = counter; counter = 1; al++; last = lider[i]; } if(DEBUG)printf("%d ",lider[i]); } lid[al].a = last; lid[al++].ile = counter; if(DEBUG)printf("\n"); if(DEBUG)for(int i=0; i<al; i++){ printf("%d - %d\n",lid[i].a,lid[i].ile); } int a,p=0; int suma = 0; for(a = al-1; a>p; ){ if( lid[a].ile * (lid[a].a-1) <= lid[p].ile * lid[p].a){ lid[p].ile -= lid[a].ile * (lid[a].a-1); suma += lid[a].ile; a--; if(DEBUG)printf("suma:%d lidp:%d\n",suma,lid[p].ile); } else { suma += lid[p].ile * lid[p].a; lid[a].ile -= lid[p].ile * (lid[a].a-1); p++; if(DEBUG)printf("pyk:%d suma:%d %d\n",p,suma,lid[a].ile); } } int rest = lid[a].ile * lid[a].a; int sub = lid[a].a + (lid[a].a-1); while(rest >= sub ){ rest -= sub; suma ++; } if(rest>0) suma++; printf("%d\n",suma); return 0; } |