小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,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
1、首先,將陣列按從小到大排好序(從大到小也行)。
2、找到最大和最小的兩個值,存乙個陣列中,然後為這兩個值尋找使得他們瘋狂值最大的數,分別連到他們兩邊。
3、接著思路類似,每次都為這個更新的陣列的頭和尾尋找使得他們瘋狂值最大的數。
4、所以要考慮四種情況,頭考慮是連最左邊的數還是最右邊的數(因為連到陣列時左右在換,有時候大的在左,有時候小的在左),尾也考慮是連最左邊的數還是最右邊的數。
5、看上面給的示例[5,10,25,40,25]
例如[40,5]->[10,40,5,25]->[25,10,40,5,25]
實現**如下:
n=int(raw_input())
x=[int(i) for i in raw_input().split()]
l=sorted(x)
defcrazy_list
(l):
temp =[l[0]]
left = 1
right = n-1
res = 0
while left<=right:
r0 = abs(temp[0] - l[right]) ##頭
r1 = abs(temp[-1] - l[right]) ## 尾
l0 = abs(temp[0]-l[left]) #頭
l1 = abs(temp[-1]-l[left]) # 尾
tl = [r0,r1,l0,l1]
m = max(tl)
if tl.index(m)==0:
temp.insert(0,l[right])
right-=1
if tl.index(m)==1:
right-=1
if tl.index(m)==2:
temp.insert(0,l[left])
left+=1
if tl.index(m)==3:
left+=1
for i in range(n-1):
res+=abs(temp[i+1]-temp[i])
return res
print crazy_list(l)
2018網易內推程式設計題 瘋狂佇列
小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,n個學生在列隊的時候,小易老師正好去衛生間了。學生們終於有機會反擊了,於是學生們決定來一次瘋狂的佇列,他們定義乙個佇列的瘋狂值為每對相鄰排列學生身高差的絕對值總和。由於按照身高順序排列的佇列...
2018網易內推程式設計題 瘋狂佇列 C
小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,n個學生在列隊的時候,小易老師正好去衛生間了。學生們終於有機會反擊了,於是學生們決定來一次瘋狂的佇列,他們定義乙個佇列的瘋狂值為每對相鄰排列學生身高差的絕對值總和。由於按照身高順序排列的佇列...
2018網易校招程式設計題(7)瘋狂佇列
小易老師是非常嚴厲的,它會要求所有學生在進入教室前都排成一列,並且他要求學生按照身高不遞減的順序排列。有一次,n個學生在列隊的時候,小易老師正好去衛生間了。學生們終於有機會反擊了,於是學生們決定來一次瘋狂的佇列,他們定義乙個佇列的瘋狂值為每對相鄰排列學生身高差的絕對值總和。由於按照身高順序排列的佇列...