1 条题解

  • 1
    @ 2024-5-10 19:54:41
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    const int maxn=502,maxm=102;
    const int INF=0x7fffffff;
    #define border2(x) min( border(x),lpos-Mem[x].pos )	
    #define border(x) min( m-1,Mem[x+1].pos-Mem[x].pos-1 )	
    int f[maxn][maxm];
    int Min[maxn][maxm];
    int a[maxn];
    struct Node{int pos,num;}Mem[maxn];int sz;
    int col(int l,int r,int pos)
    {
        int res=0;
        for(int i=l;i<=r;i++) res+=(pos-Mem[i].pos)*Mem[i].num;
    
        return res;
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+n+1);
    	a[0]=-1;
        for(int i=1;i<=n;i++)
        {
            if( a[i]!=a[i-1] ) Mem[++sz].pos=a[i];
            Mem[sz].num++;
        }
        Mem[sz+1]=(Node){INF,0};
        n=sz;
        for(int i=1;i<=n;i++) for(int j=0;j<=m;j++) f[i][j]=Min[i][j]=INF;
        for(int i=1;i<=n;i++)
            for(int j=0;j<=border(i);j++)
            {
                int pos=Mem[i].pos+j,lpos=pos-m;
                int val=col(1,i,pos);
                f[i][j]=val;
                for(int k=1; k<i and Mem[k].pos<=lpos ;k++)
                {
                    val-=(pos-Mem[k].pos)*Mem[k].num;
                    f[i][j]=min( f[i][j],Min[k][border2(k)]+val );
                }           
                Min[i][j]=f[i][j];
                if( j>0 ) Min[i][j]=min( Min[i][j],Min[i][j-1] );
            }
        printf("%d",Min[n][m-1]);
        return 0;
    }
    
    • 1

    信息

    ID
    1371
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    49
    已通过
    23
    上传者