以summation of the absolute differences between every two adjacent numbers is maximum
array =(1,2,7)
安排是(1,7,2)
sum=|1-7|+|7-2|=11
答案 0 :(得分:0)
因为您没有包含您的尝试和思考过程,所以帮助您直接解决问题是错误的。但是,我可以让你开始......
提示:通过以某种方式安排数组可以解决很多问题。例如,如果数组以某种方式排列,您可以快速从中选择最大和最小的值,那么生活就很容易。
每两个相邻数字之间的绝对差值的总和是
绝对差异意味着相邻的数字应尽可能在数字线上相互远离。当然,阵列中可能的最大差异是最大数字和最小数字之间的差异。所以,他们需要相邻重新排列。剩下的数组也有最大值和最小值,因此您可以为所有数据重复上述步骤。
试试这个,如果你在某个地方陷入困境,请回来......
答案 1 :(得分:0)
这是在O(n)时间。
int main()
{
int n;
cin>>n;
ll arr[n];
for(int i=0;i<n;i++)
cin>>arr[i];
sort(arr,arr+n);
ll i=0,j=n-1,sum=0;
while(i<j){
sum+= abs(arr[j]-arr[i]);
i++;
sum+= abs(arr[j]-arr[i]);
j--;
}
cout<<sum<<endl;
}
答案 2 :(得分:0)
你可以在O(nlogn).Think之前做到......
选择left = 5 right = 5即最大值。我是1,j是4,我给出了最大的绝对差值,所以
根据最大绝对差异在其右侧或左侧附加。在它右侧与我
现在左= 1,右= 2,4左边给出最大差异,所以
最后左右相同的差异为3
CODE :-( C ++)
sort(a.begin(),a.end());
int l=a[a.size()-1]; //left
int r=l; // right
int i=0,j=a.size()-2;
long long int sum=0;
while(i<j){
int li=abs(l-a[i]),ri=abs(r-a[i]);
int lj=abs(l-a[j]),rj=abs(r-a[j]);
if(li>ri||lj>rj){ //left side
if(li>lj){
sum+=li;
l=a[i++];
}else{
sum+=lj;
l=a[j--];
}
}else{
if(ri>rj){
sum+=ri;
r=a[i++];
}else{
sum+=rj;
r=a[j--];
}
}
//cout<<l<<"---"<<r<<"------"<<i<<"---"<<j<<"----------"<<sum<<endl;
}
sum+=MAX(abs(l-a[i]),abs(r-a[i]));
cout<<sum<<endl;