#include"stdio.h"
#include"stdlib.h"
#include"math.h"
long long int a[100000005],min=10001,n,b[24005],c[105];
void qs(long long int left,long long int right)
{
long long int temp,i=left,j=right,t=0;
temp=a[(left+right)/2];
do{
while(a[i]<temp)
i++;
while(a[j]>temp)
j--;
if(j>=i)
{
t=a[i];
a[i]=a[j];
a[j]=t;
i++;
j--;
}
}while(j>=i);
if(left<j)qs(left,j);
if(right>i)qs(i,right);
return;
}
int main()
{
long long int i,j,m,sum=0,x=0,d=1,b1=1,b2=1,max=-1,v=1,f=1,k;
scanf("%lld",&n);
for(i=0;i<n;i++)
scanf("%lld",&a[i]);
qs(0,n-1);
i=0;
a[n]=-1000000000000001;
while(i<=n)
{
if(a[i]==a[i+1] || a[i]+1==a[i+1])
if(a[i]==a[i+1])
d++;
else
{
b[b1++]=d;
if(d>max)
max=d;
d=1;
}
else
if(i!=n)
{
b[b1++]=d;
if(d>max)
max=d;
d=1;
v=1;
b[b1]=-10000000000001;
b2=1;
while(v<=b1)
{
if(b[v]==b[v+1])
{
f++;
b[v]=0;
}
else
{
c[b2++]=f;
if(max==b[v])
{
k=b2-1;
max=-1;
}
f=1;
b[v]=0;
}
v++;
}
c[b2-1]=0;
b1=1;
if(c[k]+c[k+1]>c[k]+c[k-1])
{
if(min>c[k]+c[k-1])
min=c[k]+c[k-1];
}
else
if(min>c[k]+c[k+1])
min=c[k]+c[k+1];
for(j=1;j<b2;j++)
c[j]=0;
b2=1;
}
i++;
}
printf("%lld",min);
return 0;
}
我本人的思路是最短的线一定是某一块里面最多的数向两边延申的最小值,简单来说1 2 2 3 3 4 5 我把它压成1 2 2 1 1,其中最大值2,再压 1 2 2,原来的最大值位置在2
但是,但是,我储存第二次压缩的数组长大于24005时9号点we,小于24005时5,6,10we,大无语了属于是