珍珠移动距离和(python拼多多)

题目描述:

多多鸡有一串长度为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)

 菜鸟一枚,代码仅供参考,如有问题,望指正~

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值