rt #11能过,反而#1,2过不了
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<queue>
#define Max(a,b) (((a)>(b))?(a):(b))
#define Min(a,b) (((a)<(b))?(a):(b))
#define L(i,a,b) for(int i=(a);i<=(b);i++)
#define R(i,a,b) for(int i=(a);i>=(b);i--)
#define check asjldladskas
#define mid weiyquksldjkdal
using namespace std;
const int Mxn=1e5+10;
int n;
int a[Mxn];
int cnt=0;
struct TONG { //桶形式储存
int x;//数字
int len;//数字个数
} t[Mxn];
bool check(int m) { //当某一队结束时长度小于n时,返回false
int ant=-1e9-10;//最长的 连续最大len序列 的值
int ans=1e9;//最长的 连续最大len序列 的长度
L(i,1,cnt) {
if(!(t[i-1].x+1==t[i].x)) { //达到另一个不相邻的序列,直接处理
if(ans<m)return false;
ant=-1e9-10;
ans=1e9;
}
//相邻时
if(ant<t[i].len) {
if(ans<m)return false;
ant=t[i].len;
ans=0;
}
if(t[i].len>=ant)ans++;
}
if(ans<m)return false;
return true;
}
int main() {
scanf("%d",&n);
L(i,1,n)scanf("%d",a+i);
sort(a+1,a+n+1);
L(i,1,n) {
int ta=a[i];
t[++cnt].x=ta;
while(a[i]==ta) t[cnt].len++,i++;
i--;
}
t[0].x=t[1].x-1;
t[0].len=1e9;//第一个数的长度一定可以达到
int l=1,r=n;
while(l<r) {
int mid=(l+r+1)>>1;
if(check(mid))l=mid;
else r=mid-1;
}
printf("%d\n",l);
return 0;
}