小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,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
100
這道題目有一定的難度,使用貪心的策略,乙個最大值,乙個最小值,依次的加入答案,這裡不需要輸出對應得答案陣列,只需要給出答案,所以每次維護兩個變數,乙個是當前最大值,乙個是當前最小值。
思路:先將height排序,每一次取出最小值和最大值放在佇列中
然後再取出最小值和最大值,最小值放在上次最大值的右邊
最大值放在上次最小值的左邊
note:需要判斷輸入個數的奇偶性,若是奇數,最後乙個元素
是防止在隊頭或者隊尾,需要和當前的隊頭和隊尾元素比較
eg1: 25-10-40-5-25(n為奇數)
sort:5-10-25-25-40
第一次取出min=5,max=40 queue:[5,40]
第二次取出min=10,max=25 queue:[25,5,40,10]
第三次取出25,放在隊頭or隊尾?明顯放在隊尾差異更大 queue:[25,5,40,10,25]
res = 20+35+30+15=100
eg2:1-2-4-8-6-10(n為偶數)
sort:1-2-4-6-8-10
第一次取出min=1,max=10 queue:[1,10]
第一次取出min=2,max=8 queue:[8,1,10,2]
第一次取出min=4,max=6 queue:[4,8,1,10,2,6]
res = 4+7+9+8+4=32
#include #include #include using namespace std;
const int n = 1000;
int num[n];
int main()
int res = 0, left = 1, right = n-2;
sort(num,num+n);
int max_value = num[n-1];
int min_value = num[0];
res+=abs(num[0]-num[n-1]);
while(left<=right)
else
}cout
}
2018網易校招程式設計題(7)瘋狂佇列
小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,n個學生在列隊的時候,小易老師正好去衛生間了。學生們終於有機會反擊了,於是學生們決定來一次瘋狂的佇列,他們定義乙個佇列的瘋狂值為每對相鄰排列學生身高差的絕對值總和。由於按照身高順序排列的佇列...
2018網易校招題
1 為了得到乙個數的 相反數 我們將這個數的數字順序顛倒然後再加上原先的數得到 相反數 例如,為了得到1324的 相反數 首先我們將該數的數字順序顛倒。我們得到5231,之後再加上原先的數,我們得到5231 1325 6556,如果顛倒之後的數字有字首 字首零將會被忽略。例如n 100。顛倒之後是1...
2018網易校招內推 瘋狂佇列
小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,n個學生在列隊的時候,小易老師正好去衛生間了。學生們終於有機會反擊了,於是學生們決定來一次瘋狂的佇列,他們定義乙個佇列的瘋狂值為每對相鄰排列學生身高差的絕對值總和。由於按照身高順序排列的佇列...