2024蓝桥杯每日一题(归并排序)

一、第一题:火柴排队

解题思路:归并排序

重点在于想清楚是对哪个数组进行归并排序求逆序对

【Python程序代码】

python 复制代码
from math import *
n = int(input())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
na,nb = [],[]
for i in range(n):
    na.append([a[i],i])
    nb.append([b[i],i])
na.sort()
nb.sort()
np = [0]*(n+5)
for i in range(n):
    np[na[i][1]] = nb[i][1]
tep = [0]*(100005)
def merge_sort(q, l, r):
    if l >= r: return 0
    mid = (l + r) >> 1
    res = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r)
    k, i, j = 0, l, mid + 1
    while i <= mid and j <= r:
        if q[i] <= q[j]:
            tep[k] = q[i]
            k, i = k + 1, i + 1
        else:
            res += mid - i + 1
            tep[k] = q[j]
            k, j = k + 1, j + 1

    while i <= mid:
        tep[k] = q[i]
        k, i = k + 1, i + 1
    while j <= r:
        tep[k] = q[j]
        k, j = k + 1, j + 1
    j = 0
    for i in range(l, r + 1):
        q[i] = tep[j]
        j += 1
    return res
print( (merge_sort(np,0,n-1))%99999997)

二、第二题: 归并排序

解题思路:归并排序

归并排序模板题

【Python程序代码】

python 复制代码
n = int(input())
a = list(map(int,input().split()))
tep = [0]*(n+5)
def merge_sort(q,l,r):
    if l>=r:return
    mid = (l+r)>>1
    merge_sort(q,l,mid);merge_sort(q,mid+1,r)
    k,i,j = 0,l,mid+1
    while i<=mid and j<=r:
        if q[i]<=q[j]:
            tep[k] = q[i]
            k,i=k+1,i+1
        else:
            tep[k] = q[j]
            k,j=k+1,j+1
    while i<=mid:
        tep[k]=q[i]
        k,i=k+1,i+1
    while j<=r:
        tep[k]=q[j]
        k,j=k+1,j+1
    j = 0
    for i in range(l,r+1):
        q[i]=tep[j]
        j += 1

merge_sort(a,0,n-1)
for i in range(n):
    print(a[i],end=" ")

三、第三题:逆序对的数量

解题思路:归并排序

归并排序求逆序对模板题

【Python程序代码】

python 复制代码
n = int(input())
a = list(map(int,input().split()))
tep = [0]*(n+5)
def merge_sort(q,l,r):
    if l>=r:return 0
    mid = (l+r)>>1
    res = merge_sort(q,l,mid)+merge_sort(q,mid+1,r)
    k,i,j = 0,l,mid+1
    while i<=mid and j<=r:
        if q[i]<=q[j]:
            tep[k] = q[i]
            k,i=k+1,i+1
        else:
            res += mid - i + 1
            tep[k] = q[j]
            k,j=k+1,j+1
            
    while i<=mid:
        tep[k]=q[i]
        k,i=k+1,i+1
    while j<=r:
        tep[k]=q[j]
        k,j=k+1,j+1
    j = 0
    for i in range(l,r+1):
        q[i]=tep[j]
        j += 1
    return res
print(merge_sort(a,0,n-1))

四、第四题:小朋友排队

解题思路:归并排序

归并排序求出每个数与其他数组成的逆序对数,然后求和公式累加

【Python程序代码】

python 复制代码
n = int(input())
a = list(map(int, input().split()))
q,tep = [],[[0]*2 for _ in range(n+5) ]
for i in range(n):q.append( [a[i],i] )
sum = [0]*(n+5)
def merge(q,l,r):
    if l>=r:return
    mid = (l+r)>>1
    merge(q,l,mid);merge(q,mid+1,r)
    k,i,j=0,l,mid+1
    while i<=mid and j<=r:
        if q[i][0]<=q[j][0]:
            tep[k]=q[i]
            sum[q[i][1]] += j-mid-1
            k,i = k+1,i+1
        else:
            tep[k]=q[j]
            sum[q[j][1]] += mid-i+1
            k,j = k+1,j+1
    while i<=mid:
        tep[k] = q[i]
        sum[q[i][1]] += j-mid-1
        k,i = k+1,i+1
    while j<=r:
        tep[k] = q[j]
        k,j = k+1,j+1
    j = 0
    for i in range(l,r+1):
        q[i]=tep[j]
        j += 1
merge(q,0,n-1)
res = 0
for i in range(n):
    res += (sum[i])*(sum[i]+1)//2
print(res)

五、第五题:超快速排序

解题思路:归并排序

归并排序求逆序对模板题

【Python程序代码】

python 复制代码
import sys
tep = [0] * (500005)
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)
    k,i,j = 0,l,mid+1
    while i<=mid and j<=r:
        if q[i]<=q[j]:
            tep[k]=q[i]
            k,i = k+1,i+1
        else:
            tep[k]=q[j]
            res += mid-i+1
            k,j = k+1,j+1
    while i<=mid:
        tep[k] = q[i]
        k,i = k+1,i+1
    while j<=r:
        tep[k] = q[j]
        k,j = k+1,j+1
    j = 0
    for i in range(l,r+1):
        q[i] = tep[j]
        j += 1
    return res
n = int(sys.stdin.readline())
while n!=0:
    a = []
    for i in range(n):
        a.append(int(sys.stdin.readline()))
    print(merge_sort(a,0,n-1))
    n = int(sys.stdin.readline())
            
    
    
相关推荐
碳基学AI3 分钟前
哈尔滨工业大学DeepSeek公开课:探索大模型原理、技术与应用从GPT到DeepSeek|附视频与讲义免费下载方法
大数据·人工智能·python·gpt·算法·语言模型·集成学习
niuniu_6664 分钟前
简单的自动化场景(以 Chrome 浏览器 为例)
运维·chrome·python·selenium·测试工具·自动化·安全性测试
补三补四7 分钟前
机器学习-聚类分析算法
人工智能·深度学习·算法·机器学习
FearlessBlot7 分钟前
Pyinstaller 打包flask_socketio为exe程序后出现:ValueError: Invalid async_mode specified
python·flask
独好紫罗兰17 分钟前
洛谷题单3-P5718 【深基4.例2】找最小值-python-流程图重构
开发语言·python·算法
你今天刷题了吗?18 分钟前
蓝桥杯练习:翻转二叉树
蓝桥杯
果冻人工智能20 分钟前
法官们终于似乎明白了:如果没有复制,那就没有版权
人工智能
tle_sammy21 分钟前
AI 重构老旧系统:创业新曙光
人工智能·重构
果冻人工智能23 分钟前
什么是 MCP,以及你为什么该关注它
人工智能
誉鏐28 分钟前
PyTorch复现逻辑回归
人工智能·pytorch·逻辑回归