[编程题4][牛客]疯狂队列
题目描述:原题地址
小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,n个学生在列队的时候,小易老师正好去卫生间了。学生们终于有机会反击了,于是学生们决定来一次疯狂的队列,他们定义一个队列的疯狂值为每对相邻排列学生身高差的绝对值总和。由于按照身高顺序排列的队列的疯狂值是最小的,他们当然决定按照疯狂值最大的顺序来进行列队。现在给出n个学生的身高,请计算出这些学生列队的最大可能的疯狂值。小易老师回来一定会气得半死。
基本思路:
先将身高从小到大排序,在新的队列首位两端依次插入最大、最小,保证每次插入新的数字时差值最大。最后遍历新的队列算差值,或者直接在插入时累计。
注意区分人数为单双数的情况。
源代码@Python
1 n = input()
2 h = map(int, raw_input().split())
3 h = sorted(h)
4 tmp = 0
5 if n%2:
6 tmp = h[n/2]
7 h = h[0:n/2]+h[n/2+1:n]
8 n = n-1
9 r = [h[0]]
10 start = 1
11 end = n-1
12 s = 0
13 for i in range(1,n):
14 if i%2==1: # put a large number
15 if r[0]<r[-1]:
16 r.insert(0,h[end])
17 s = s+abs(r[0]-r[1])
18 else:
19 r.append(h[end])
20 s = s+abs(r[-1]-r[-2])
21 end = end-1
22 else: # put the small number
23 if r[0]>r[-1]:
24 r.insert(0,h[start])
25 s = s+abs(r[0]-r[1])
26 else:
27 r.append(h[start])
28 s = s+abs(r[-1]-r[-2])
29 start = start+1
30 if tmp>0:
31 if abs(r[0]-tmp)>abs(r[-1]-tmp):
32 r.insert(0,tmp)
33 s = s+abs(r[0]-r[1])
34 else:
35 r.append(tmp)
36 s = s+abs(r[-1]-r[-2])
37 #s=0
38 #for i in range(len(r)-1):
39 # s = s+abs(r[i+1]-r[i])
40 print s