题目描述:
多多鸡有一串长度为L的珍珠项链,上面有N颗珍珠,分布在0到L-1这些位置上。
现在多多鸡想把所有的珍珠移动到一起,并且想让所有珍珠移动的距离总和尽可能小。
所有的珍珠可以看作在一个环上,珍珠可以向相邻的没有珍珠的位置移动。
请给出最优的方案下,所有珍珠移动的距离的总和。
输入描述:
共两行,第一行是两个整数L,N。(2<N<L<100000)
第二行是N个整数,表示每个珍珠所在的位置。
题目保证所有珍珠的位置都各不相同。
输出描述:
所有珍珠移动的距离的总和。
示例1:
输入:
1000 4
1 4 998 995
输出:
8
说明:
将位置为1的珍珠移动到位置0
将位置为4的珍珠移动到位置1
将位置为998的珍珠移动到位置999
将位置为995的珍珠移动到位置998
示例2:
输入:
10 5
1 3 5 7 9
输出:
6
说明:
将位置为1的珍珠移动到位置3
将位置为3的珍珠移动到位置4
将位置为5的珍珠保持不动
将位置为7的珍珠移动到位置6
将位置为9的珍珠移动到位置7
import sys
L,N = map(int,sys.stdin.readline().strip().split(' '))
position = list(map(int,sys.stdin.readline().strip().split(' ')))
#固定住position[0]这颗珍珠,将其余珍珠移动到和它一起的位置
#使用tmp分别记录position[i]这颗珍珠的移动距离,其中顺时针移动为正数,逆时针移动为负数
tmp = [0]
for i in range(1,len(position)):
if position[i]-position[0]-i < position[0]+(L-1)-position[i]-len(position[i+1:]):
tmp.append(position[i]-position[0]-i)
else:
tmp.append((-1)*(position[0]+(L-1)-position[i]-len(position[i+1:])))
#固定住position[0]这颗珍珠后,对所有的珍珠移动距离和进行求解,记为res
res = sum([abs(x) for x in tmp])
#判断珍珠整体是否可以顺时针移动或者逆时针移动,或者当前结果即为最优解(PS:要左移只能左移,要右移只能右移)
if sum([abs(y) for y in [x-1 for x in tmp]]) == res and sum([abs(y) for y in [x+1 for x in tmp]]) == res:
print(res)
elif sum([abs(y) for y in [x-1 for x in tmp]]) < res:
#一直左移直到结果最小
while sum([abs(y) for y in [x-1 for x in tmp]]) < res:
tmp = [x-1 for x in tmp]
res = sum([abs(x) for x in tmp])
elif sum([abs(y) for y in [x+1 for x in tmp]]) > res:
#一直右移直到结果最小
while sum([abs(y) for y in [x+1 for x in tmp]]) < res:
tmp = [x+1 for x in tmp]
res = sum([abs(x) for x in tmp])
print(res)
菜鸟一枚,代码仅供参考,如有问题,望指正~