題目連接ios
思惟+貪心c++
時間複雜度O(nlogn)
算法
1.這道題的題意主要就是讓你對一個數組進行一種特殊的排序,使得數組中相鄰的兩個數的差的絕對值成非遞減趨勢;數組
2.剛開始對這道題老是固執於兩個相等的數在不一樣位置,如何把它們放到前面
這個問題,由於路走歪了,最終無果,沒有思路。後來看了一些關於這道題的解題博客,豁然開朗。spa
3.使得數組中相鄰的兩個數的差的絕對值成非遞減趨勢,怎麼想呢。單純想怎麼從差的絕對值最小到最大變化不太容易想,咱們能夠反過來想,怎麼由差的絕對值最大到最小變化。何時差的絕對值最大,固然是數組中的最小值和最大值之間的差的絕對值最大。最小值和次大值之間的差的絕對值大
仍是最小值和次小值之間的差的絕對值大
(或者最大值和次小值的差的絕對值大
仍是最大值和次大值的絕對值大
),固然是前者。code
4.而後在想接下來可能再小的是什麼,固然是次小值和次大值之間的差的絕對值。以此類推,能夠的出下面這個式子。排序
最小值、最大值、次小值、次大值、第三小值、第三大值、... 或者 最大值、最小值、次大值、次小值、第三大值、第三小值、...
注意上面的式子只是爲了好理解才按照這個順序寫的,最終輸出的時候不要忘了把它倒過來(不知道爲啥請看題意)。ci
5.列出了式子後,那麼思考一下何時纔到頭呢,即到哪裏結束呢?get
對於偶數個數的數組來說,即最終達處處於中間的那兩個數;博客
對於奇數個數的數組來說,即最終到達處於中間的那一個數。
因此要特判一下。這也是爲何前面一開始就說要將題意倒過來想,不然直接想出從中間向兩邊展開這個思路不太容易。
6.因此最終得出的思路是先對數組排序,而後從中間向兩邊展開輸出。
#include<iostream> #include<algorithm> using namespace std; const int N = 1e5 + 10; int t, n; int a[N]; int main() { cin >> t; while(t--) { cin >> n; for(int i = 0; i < n; i++) cin >> a[i]; sort(a, a + n); /* n = 5 0,1,2,3,4 n = 4 0,1,2,3 */ int l, r; if(n % 2 == 1) { cout << a[n/2] << " "; l = n / 2 - 1, r = n / 2 + 1; } else l = n / 2 - 1, r = n / 2; while(l >= 0 && r < n) { //cout << a[r] << " " << a[l] << " "; cout << a[l] << " " << a[r] << " "; //上面這兩個式子用哪一個均可以 ++r; --l; } puts(""); } return 0; }