通过重新排列数组来最大化阵列绝对差的总和

时间:2016-05-28 08:13:07

标签: algorithm sorting language-agnostic

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

3 个答案:

答案 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之前做到......

  1. 对阵列进行排序1 2 3 4 5
  2. 选择left = 5 right = 5即最大值。我是1,j是4,我给出了最大的绝对差值,所以

    1-5 ==&gt;总和+ = | 5-1 | ==→4

  3. 根据最大绝对差异在其右侧或左侧附加。在它右侧与我

    1-5-2 ==&gt;总和+ = | 5-2 | ==大于7

  4. 现在左= 1,右= 2,4左边给出最大差异,所以

    4-1-5-2 ==&gt;总和+ = | 4-1 | ==&GT; 10

  5. 最后左右相同的差异为3

    3-4-1-5-2或4-1-5-2-3 ==&gt;总和+ = 1 ==&GT; 11

  6. 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;