当前位置:   article > 正文

第十五届蓝桥杯省赛第二场PythonB组B题【逆序对期望】题解(AC)

第十五届蓝桥杯省赛第二场PythonB组B题【逆序对期望】题解(AC)

在这里插入图片描述

解题思路

枚举所有的可能的交换情况,时间复杂度 O ( n 4 ) O(n^4) O(n4)

用归并排序计算数组的逆序对,时间复杂度 O ( n ) O(n) O(n)

综上时间复杂度 O ( n 5 ) O(n^5) O(n5)

由于 Python 运行效率较低,约 500 500 500 秒可得到结果。

N = 55

n = 51
a = [0] * N
tmp = [0] * N

def merge_sort(q, l, r):
    if l >= r:
        return 0
    
    mid = (l + r) // 2
    res = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r)
    
    i = l
    j = mid + 1
    k = 0
    while i <= mid and j <= r:
        if q[i] <= q[j]:
            tmp[k] = q[i]
            k += 1
            i += 1
        else:
            tmp[k] = q[j]
            res += mid - i + 1
            k += 1
            j += 1
    while i <= mid:
        tmp[k] = q[i]
        k += 1
        i += 1
    while j <= r:
        tmp[k] = q[j]
        k += 1
        j += 1
    
    for i in range(l, l + k):
        q[i] = tmp[i - l]
    
    return res

cnt = 0
res = 0
for i in range(1, n + 1):
    for j in range(1, n + 1):
        if i != j:
            for u in range(1, n + 1):
                for v in range(1, n + 1):
                    if u != v:
                        cnt += 1
                        a = list(range(0, n + 1))
                        a[i], a[j] = a[j], a[i]
                        a[u], a[v] = a[v], a[u]
                        res += merge_sort(a, 1, n)

print("%.2lf" % (res / cnt))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55

运行结果:

65.33
  • 1

【在线测评】

在这里插入图片描述

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号