小码哥最近获得了 n 颗珍珠,第 i 颗珍珠以任意顺序排列后串成一串项链,定义一个项链的美观值为相邻珍珠的美观值之差的绝对值之和

小码哥最近获得了 n 颗珍珠,第 i 颗珍珠以任意顺序排列后串成一串项链,定义一个项链的美观值为相邻珍珠的美观值之差的绝对值之和,即

img


其中 ai 为重新排列后的项链上的第 i 颗珍珠的美观值,由于项链是一个环,我们这里定义

img


现在他想知道,在所有可能的情况下得到的项链的最大美观值为多少。请你编写一个程序帮助他计算一下这个值。

img

img

可以参考参考我的代码

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,a[10000],maxn=0;
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",a+i);
    for(int i=0;i<n;i++){
        if(abs(a[0]-a[n-1])+abs(a[1]-a[2])<abs(a[1]-a[n-1])+abs(a[0]-a[2]))
            swap(a[0],a[1]);
        for(int j=1;j<n-2;j++)
            if(abs(a[j]-a[j-1])+abs(a[j+1]-a[j+2])<abs(a[j+1]-a[j-1])+abs(a[j]-a[j+2]))
                swap(a[j],a[j+1]);
        if(abs(a[n-3]-a[n-4])+abs(a[n-2]-a[n-1])<abs(a[n-2]-a[n-4])+abs(a[n-1]-a[n-3]))
            swap(a[n-2],a[n-1]);
        if(abs(a[n-2]-a[n-3])+abs(a[n-1]-a[0])<abs(a[n-1]-a[n-3])+abs(a[0]-a[n-2]))
            swap(a[n-1],a[0]);
    }
    for(int i=0;i<n-1;i++)
        maxn+=abs(a[i]-a[i+1]);
    maxn+=abs(a[n-1]-a[0]);
    printf("%d",maxn);
}

部分供参考

#include<stdio.h>
#include<math.h>
#define max 10000
int cal(int t[],int i,int n)
{
    int sum=0;
    for(int j=i; j<=n; j++)
    {
        {
            sum+=abs(t[j]-t[j+1]);
        }
    }
    return sum;
}
int main()
{
    int  n, i, j,t[max];
    scanf("%d",&n);
    for(i=1; i<=n; i++)
    {
        scanf("%d",&t[i]);
    }
    t[0]=t[n];
    t[n+1]=t[1];
    int Max=cal(t,1,n);
    for(i=1; i<=n; i++)
    {
        int tem=cal(t,i,n);
        if(tem>Max)
        {
            Max=tem;
        }
    }
    printf("%d",Max);
    return 0;
}