Codeforces Round #633 (div.2) B. Sorted Adjacent Differences

题目描述

http://codeforces.com/contest/1339/problem/B

有一个长度为 \(n(3\le n \le 10^5)\) 的整数序列 \(a_1,a_2,...,a_n(-10^9\le a_i\le 10^9)\)

将序列重排序使得 \(|a_1-a_2|\le|a_2-a_3|\le...\le|a_{n-1}-a_n|\)

输出任意一种满足上述条件的排序方式。

解题

这里采用一种类似贪心的策略:

  • 序列 \(a\) 中的最大值与最小值差的绝对值(\(|a_{max}-a_{min}|\))一定是序列中最大的;
  • 最大值和次小值的差的绝对值一定是第二大的;
  • 次大值和次小值的差的绝对值一定是第三大的;
  • 以此类推…

我们先将数组按升序排序,使得 \(a_1\le a_2\le...\le a_n\)

然后按照 \(a_{(n-k+1)},a_k,...,a_{n-1},a_2,a_n,a_1\) 顺序输出,即为所求。

#include
#define ll long long

#define fr(i,n) for(int i=0;i=j;i--)

#define frrs(i,j,n,flag)    for(int i=j;i=j&&flag;i--)

#define arend(i,n) ((i!=n-1)?" ":"\n")
#define memset0(dp) memset(dp,0,sizeof(dp))
#define print_arr(begin,end)    for(auto it = begin;it!=end;it++)  cout<<*it<>a;return a;}
string  to_str(double a)    {stringstream ss;ss<>t){
        while(t--){
            int n;
            cin>>n;
            fr(i,n){
                cin>>a[i];
            }
            sort(a,a+n);
            int tail = 0;
            int b = 0,e = n-1;
            while(b<=e){
                ans[tail++] = a[b];
                if(b!=e) ans[tail++] = a[e];
                b++,e--;
            }
            r_frr(i,0,n){
                cout<

你可能感兴趣的:(Codeforces Round #633 (div.2) B. Sorted Adjacent Differences)