网易面试题疯狂队列python版
题目描述
小易老师是非常严厉的,它会要求所有学生在进入教室前都排成一列,并且他要求学生按照身高不递减的顺序排列。有一次,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
输出
复制100
解题思路:先从k1取出最大的放k2中间,然后从k1左边取两个,分别放到k2的两边;再从k1右边取最后两个,分别放在k2的两边。k1随取随删。循环。
输入 1 2 3 4 5 6 7 8 9
1: 9
2: 1 9 2
3: 7 1 9 2 8
4: 3 7 1 9 2 8 4
5: 5 3 7 1 9 2 8 4
有一点需要注意的就是可能会出现这样的一种特例,由于可能会有大量重复的数,再放入最后一个数的时候要注意,计算它放在最左侧或最右侧时与相邻的元素差值的绝对值,选择把它放在绝对值大的那一侧
如 输入: 1 1 1 1 1 1 3 3 3 3 2 2 2 2
最后直接上代码
M= int(input()) k1 = [i for i in map(int, input().split())] # M=15 # k1=[1,1,1,1,1,1,1,2,2,2,2,3,3,3,3] # M=5 # k1=[5, 10, 25, 25, 40] # M=8 # k1=[2,3,5,7,11,13,17,19] result=0 if M>2: k1.sort() k2=[k1[-1]] del(k1[-1]) lrbiao=1 while k1: if len(k1)==1: if lrbiao==1: k2.insert(0,k1[0]) break else: k2.append(k1[0]) break if lrbiao==1: k2.insert(0,k1[0]) del(k1[0]) k2.append(k1[0]) del(k1[0]) lrbiao=0 else: k2.insert(0,k1[-1]) del(k1[-1]) k2.append(k1[-1]) del(k1[-1]) lrbiao=1 #最后两位相同的极端情况 if abs(k2[-1]-k2[-2])<abs(k2[0]-k2[-1]): temp=k2[-1] k2.pop() k2.insert(0,temp) for x in range(M-1): result+=abs((k2[x+1]-k2[x])) elif M==2: result=abs(k1[0]-k1[1]) print(result)