【洛谷】P1116 车厢重组【python版】

【洛谷】P1116 车厢重组【python】

0.题意

本题目写成入门的红题总感觉有些不妥,至少是普及的级别了吧。徒手写归并也不是2min就能搞定的。

1.分析

用归并排序求逆序数
本题主要有如下几个点需要注意:
01.归并排序用Python的写法
02.python 中数组如果没有申请足够大小是无法直接通过下标访问的
03.样例输入输出的问题。本题的测试样例采取了三种 不同的输入方式:
a.以空格分割
b.以换行分割
c.以空格和换行分割
反正输入的数据特别烦人,从C++转Python真的是很不习惯。

2.代码

N = 10005
res = 0
temp = [0] * N # 临时数组,必须使用这种方式才可以,如果直接用.append()的话,会出现问题
# 使用归并排序
def mergeSort(left,right):
    global res
    global temp
    if left >= right: # 直接返回
        return
    mid = (left+right)//2  # 直接二分
    mergeSort(left,mid)
    mergeSort(mid+1,right)

    # 开始合并
    index = tl = left
    tr = mid + 1
    while tl <= mid and tr <= right:
        if arr[tl] <= arr[tr]:
            temp[index] = arr[tl] # 开始赋值
            tl += 1
            index += 1

        # 如果是从右侧开始赋值,说明左侧的值要大
        if arr[tr] <= arr[tl]:
            temp[index] = arr[tr]  # 开始赋值
            tr+=1
            index+=1
            res += (mid - tl + 1)

    # 赋值剩余的数组值
    while tl<=mid:
        temp[index]=arr[tl]
        tl+=1
        index+=1

    while tr<=right:
        temp[index] = arr[tr]
        index+=1
        tr+=1
        res += (mid-tl+1)

    # 写回到arr 数组中
    for i in range(left,right+1):
        arr[i] = temp[i]


n = input()
n = int(n)
arr=[]
while len(arr)<n: # 如果没有读够n个数字
    num = input()
    nums = num.strip().split()
    nums = [int(i) for i in nums]
    for i in nums:
        arr.append(i)
#print(arr)

# 进行一个归并排序
mergeSort(0,n-1)
# for i in range(n):
#     print(arr[i],end = " ")
print(res)

"""
5
1 4 2 5 3 

5
1
2
3
4
5
"""

你可能感兴趣的:(#,络谷,#,排序,python,算法)