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

话不多说,直接上图:
360实习---给定一个1到N的排列A1到AN,每次可以将排列的第一个数移动到排列的末尾,假设经过若干次移动后得到排列B1到BN,那么|B1-1|+|B2-2|+...+|BN-N|的最小值是多少_第1张图片
经过两次移动过后得到排列{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()

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

你可能感兴趣的:(数据结构)