1 条题解

  • 0
    @ 2025-2-14 21:20:40

    C++ :

    #include<iostream>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    int len[105],f[105][52];
    bool solve(int n,int k);
    //ifstream cin("chop.in");
    //ofstream cout("chop.out");
    int main()
    {
        int n,k;
        cin>>n>>k;
        k+=3;
        for (int i=1;i<=n;i++) cin>>len[i];
        if (!solve(n,k)) cout<<-1<<endl;
        else cout<<f[n][k]<<endl;
        //system("pause");
        return 0;
    }
    bool solve(int n,int k)
    {
        if (n<k*2) return false;
        memset(f,0x7f,sizeof(int)*105*52);
        sort(len+1,len+n+1);
        for (int i=0;i<=n;i++) f[i][0]=0;
        for (int j=1;j<=k;j++)
            for (int i=2*j;i<=n;i++)
            {
                f[i][j]=f[i-2][j-1]+(len[i]-len[i-1])*(len[i]-len[i-1]);
                if (i>2*j) f[i][j]=min(f[i][j],f[i-1][j]);
            }
        return true;
    }
    

    Pascal :

    var
     a:array [1..100] of longint;
     f:array [0..100,0..50] of longint;
     n,m,xb,i,j,k:longint;
     function min(x,y:longint):longint;
     begin
      if x>y then
       exit(y) else
       exit(x);
     end;
    begin
     readln(n,k);
     for i:=1 to n do
      read(a[i]);
     k:=k+3;
     if k*2>n then
     begin
      writeln(-1);
      halt;
     end;
     for i:=1 to n do
      for j:=1 to n-i do
       if a[j+1]<a[j] then
       begin
        m:=a[j];
        a[j]:=a[j+1];
        a[j+1]:=m;
       end;
     for i:=0 to 100 do
      for j:=0 to 50 do
       f[i,j]:=maxlongint;
     for i:=0 to n do
      f[i,0]:=0; 
     for i:=1 to n do
      for j:=1 to k do
       if j*2>i then
        break else
        f[i,j]:=min(f[i-1,j],f[i-2,j-1]+sqr(a[i]-a[i-1]));
     writeln(f[n,k]);
    end.
    
    
    • 1

    信息

    ID
    765
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者