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())
            
    
    
相关推荐
回眸&啤酒鸭3 天前
【回眸】Minicart 电商购物车核心功能落地指南
人工智能
一隅论数智3 天前
给AI一张“业务概念地图“:本体如何从哲学走向企业智能
大数据·人工智能·经验分享·笔记·学习·学习方法·政务
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
AI的探索之旅3 天前
97 个 OpenCV 实例(三十):双目立体,从标定到点云
人工智能·opencv·计算机视觉
AlbertZein3 天前
Step-5-Preview 上手实测:3D 游戏、金融分析、网页设计一次跑完
人工智能·aigc
LaughingZhu3 天前
Product Hunt 每日热榜 | 2026-09-19
人工智能·深度学习·神经网络·搜索引擎·百度
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk