360实习---给定一个1到N的排列A1到AN,每次可以将排列的第一个数移动到排列的末尾,假设经过若干次移动后得到排列B1到BN,那么|B1-1|+|B2-2|+...+|BN-N|的最小值是多少

本文介绍了一种通过暴力破解方法来寻找使排列逆序数最小的算法实现过程。通过对给定序列进行循环移位,并计算每次移位后的逆序数总和,最终找出最小值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

话不多说,直接上图:
在这里插入图片描述
经过两次移动过后得到排列{1 5 2 4 3},此时|B1-1|+|B2-2|+|B3-3|+|B4-4|+|B5-5|取得最小值。

此题我才用了暴力破解的方法,每次将第一个元素移动到末尾,然后计算值付给一个列表,最后求列表的最小值。
代码如下:

class Qh(object):
    def sum1(self, a, b):
        sums = 0
        for i in range(1, b + 1):
            sums += abs(a[i - 1] - i)
        return sums

    def max1(self, a, b):
        l = [0] * b
        for i in range(b):
            l[i] = self.sum1(a, b)
            a.append(a[0])
            a.pop(0)
        print(min(l))


def main():
    qh = Qh()
    qh.max1(a, b)


if __name__ == '__main__':
    b = input()
    b = int(b)
    a = input()
    a = [int(x) for x in list(a.replace(' ', ''))]
    main()

在这里插入图片描述
加油!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值