#include<stdio.h>
#include<queue>
#include<map>
#include<algorithm>
using namespace std;
int lnk[100005],knl[100005],ans=2147483647;
map<int,bool> mp;
map<int,int> mps;
struct r{
int num,val;
r(int x=0,int y=0){val=x,num=y;}
inline bool operator<(const r &x) const{
return val>x.val;
}
}a[100005],link,f[100005];
priority_queue<r> q;
int main(){
int n,num=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&lnk[i]);
for(int i=1;i<=n;i++){
if(!mp[lnk[i]]) mp[lnk[i]]=true,knl[++num]=lnk[i];
mps[lnk[i]]++;
}
for(int i=1;i<=num;i++) q.push(r(knl[i],mps[knl[i]]));
while(q.size()){
int ns=0;
link=q.top();q.pop();
f[++ns]=link;
while(q.size()&&link.val+1==q.top().val){
link=q.top();q.pop();
f[++ns]=link;
}
int min_num=a[1].num;
for(int i=2;i<=ns;i++) min_num=min(min_num,a[i].num);q.push(r(f[i].val,f[i].num-min_num));
while(q.size()&&q.top().num==0) q.pop();
ans=min(ans,ns);
}
printf("%d",ans);
return 0;
}