題目描述:
小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,n個學生在列隊的時候,小易老師正好去衛生間了。學生們終於有機會反擊了,於是學生們決定來一次瘋狂的佇列,他們定義乙個佇列的瘋狂值為每對相鄰排列學生身高差的絕對值總和。由於按照身高順序排列的佇列的瘋狂值是最小的,他們當然決定按照瘋狂值最大的順序來進行列隊。現在給出n個學生的身高,請計算出這些學生列隊的最大可能的瘋狂值。小易老師回來一定會氣得半死。
輸入描述:
輸入包括兩行,第一行乙個整數n(1 ≤ n ≤ 50),表示學生的人數輸出描述:第二行為n個整數h[i](1 ≤ h[i] ≤ 1000),表示每個學生的身高
輸出乙個整數,表示n個學生列隊可以獲得的最大的瘋狂值。輸入例子1:如樣例所示:
當佇列排列順序是: 25-10-40-5-25, 身高差絕對值的總和為15+30+35+20=100。
這是最大的瘋狂值了。
5輸出例子1:5 10 25 40 25
100解析:規律題,首先對陣列從小到大排序。例如:
1、先排最大值。
2、然後在最大的兩端分別插入當前最小的兩個值,小的向後插入,大的向前插入。
3、然後在兩端分別插入當前最大的兩個值,大的向後插入,小的向前插入。
4、重複2、3,直至所有的資料全部插入。如下:
5、微調資料(對於相等元素較多的情況,如下)。
deque q;//雙端佇列
int main()
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)//兩端分別插入當前最大的兩個值,大的向後插入,小的向前插入
}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]))//對於相等的數很多的時候,會有上例情況出現,所以要調整一下
for(int i = 1; i < n; ++i)
cout<
2018網易內推程式設計題 瘋狂佇列
小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,n個學生在列隊的時候,小易老師正好去衛生間了。學生們終於有機會反擊了,於是學生們決定來一次瘋狂的佇列,他們定義乙個佇列的瘋狂值為每對相鄰排列學生身高差的絕對值總和。由於按照身高順序排列的佇列...
2018網易校招內推 瘋狂佇列
小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,n個學生在列隊的時候,小易老師正好去衛生間了。學生們終於有機會反擊了,於是學生們決定來一次瘋狂的佇列,他們定義乙個佇列的瘋狂值為每對相鄰排列學生身高差的絕對值總和。由於按照身高順序排列的佇列...
練習 瘋狂佇列
小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,n個學生在列隊的時候,小易老師正好去衛生間了。學生們終於有機會反擊了,於是學生們決定來一次瘋狂的佇列,他們定義乙個佇列的瘋狂值為每對相鄰排列學生身高差的絕對值總和。由於按照身高順序排列的佇列...