網易瘋狂佇列

hearthougan發表於2017-08-17

題目來源:

題目描述:

小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,n個學生在列隊的時候,小易老師正好去衛生間了。學生們終於有機會反擊了,於是學生們決定來一次瘋狂的佇列,他們定義一個佇列的瘋狂值為每對相鄰排列學生身高差的絕對值總和。由於按照身高順序排列的佇列的瘋狂值是最小的,他們當然決定按照瘋狂值最大的順序來進行列隊。現在給出n個學生的身高,請計算出這些學生列隊的最大可能的瘋狂值。小易老師回來一定會氣得半死。 


輸入描述:
輸入包括兩行,第一行一個整數n(1 ≤ n ≤ 50),表示學生的人數
第二行為n個整數h[i](1 ≤ h[i] ≤ 1000),表示每個學生的身高


輸出描述:
輸出一個整數,表示n個學生列隊可以獲得的最大的瘋狂值。

如樣例所示: 
當佇列排列順序是: 25-10-40-5-25, 身高差絕對值的總和為15+30+35+20=100。
這是最大的瘋狂值了。

輸入例子1:
5
5 10 25 40 25

輸出例子1:
100

解析:

規律題,首先對陣列從小到大排序。例如:


1、先排最大值。

2、然後在最大的兩端分別插入當前最小的兩個值,小的向後插入,大的向前插入。

3、然後在兩端分別插入當前最大的兩個值,大的向後插入,小的向前插入。

4、重複2、3,直至所有的資料全部插入。如下:


5、微調資料(對於相等元素較多的情況,如下)。


#include <iostream>
#include <deque>
#include <vector>
#include <algorithm>

using namespace std;

deque <int> q;//雙端佇列

int main()
{
    int n, a;
    vector <int> arr;
    cin>>n;
    for(int i = 0; i < n; ++i)
    {
        cin>>a;
        arr.push_back(a);
    }

    sort(arr.begin(), arr.end());


    q.push_back(arr[n-1]);

    int j = n-2, num = 1;
    int i = 0;
    while(num < n)
    {
        if(num >= n)
            break;
        if(num < n)//兩端分別插入當前最小的兩個值,小的向後插入,大的向前插入
        {
            q.push_back(arr[i++]);
            num++;
            if(num >= n)
                break;
            q.push_front(arr[i++]);
            num++;
        }
        if(num < n)//兩端分別插入當前最大的兩個值,大的向後插入,小的向前插入
        {
            q.push_back(arr[j--]);
            num++;
            if(num >= n)
                break;
            q.push_front(arr[j--]);
            num++;
        }
    }

    int sum = 0;
    /**
       original                   10 10 10 20 20 50 50

                              ---> 20 20 10 50 10 50 10    ===> 170

    mv first to last position ---> 20 10 50 10 50 10 20    ===> 180
    */
    if(abs(q[0] - q[1]) < abs(q[n-1] - q[0]))//對於相等的數很多的時候,會有上例情況出現,所以要調整一下
    {
        q.push_back(q.front());
        q.pop_front();
    }
    for(int i = 1; i < n; ++i)
    {
        sum += abs(q[i] - q[i-1]);
    }

    cout<<sum<<endl;
    return 0;
}





相關文章