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
#include <iostream>
#include <cstdio>

using namespace std;

void quickSort(int tab[], int left, int right){
     int i=left;
     int j=right;
     int x=tab[(left+right)>>1];
     do{
         while(tab[i]<x) i++;
         while(tab[j]>x) j--;
         if(i<=j){                  
             int temp=tab[i];
             tab[i]=tab[j];
             tab[j]=temp;
             i++;
             j--;
         }
     }while(i<=j);
     if(left<j) quickSort(tab,left,j);
     if(right>i) quickSort(tab,i,right);     
}
int main()
{
    int n,l,li = 0, out = 0;
    scanf("%d", &n);
    int wystapienia[n] = {0};
    for(int i = 0; i < n; i++){
        scanf("%d", &l);
        wystapienia[l-1]++;
    }
    quickSort(wystapienia, 0, n-1);
    while(true){
        l=-1;
        for(int i = n-1; i >=0; i--){
            if(wystapienia[i] != 0){
                if(i-1 < 0){
                    out++;
                    l = -1;
                    break;
                }
                else if(wystapienia[i-1] <= wystapienia[i]){
                    l = wystapienia[i];
                    li = i;
                    break;
                }
            }
        }
        if(l == -1){
            break;
        }
        int s = 0;
        for(int i = 0; i < n; i++){
            if(s + wystapienia[i] >= l){
                if(l == wystapienia[i]){
                    wystapienia[i] -= (l - (s + 1));
                }
                break;
            }
            s += wystapienia[i];
            wystapienia[i] = 0;
        }
        l = 0;
        wystapienia[li] = 0;
        out++;
    }
    printf("%d", out);
    return 0;
}