我这辈子没这么无语过
查看原帖
我这辈子没这么无语过
514343
I_Love_QingYu楼主2022/4/10 22:24
#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--;//printf("mid=%d,%d %d %d %d %d\n",temp,a[0],a[1],a[2],a[3],a[4]);
        }
    }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;
            //printf("\n");
            
            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("%d ",k);
        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,大无语了属于是
2022/4/10 22:24
加载中...