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())
            
    
    
相关推荐
2401_872418783 小时前
算法入门:数据结构-堆
数据结构·算法
火山引擎开发者社区3 小时前
技术速递|使用 GitHub Copilot CLI 构建 Emoji 列表生成器
人工智能
weelinking4 小时前
【产品】12_接入数据库——让数据永久保存
jvm·数据库·python·react.js·数据挖掘·前端框架·产品经理
codefan※4 小时前
干掉“幻觉“实战:如何构建企业级知识图谱增强 RAG
人工智能·知识图谱
wukangjupingbb4 小时前
传统基于药物 SMILES 序列和蛋白质氨基酸序列的 DTI(Drug-Target Interaction)预测方法的缺陷
人工智能
沪漂阿龙4 小时前
Codex 额度重置周期变化:AI 编程免费试玩时代正在结束
人工智能
程序大视界4 小时前
【Python系列课程】Python正则表达式(下):环视、命名分组与日志实战
开发语言·python·正则表达式
TickDB4 小时前
美股行情 API 接入避坑:REST 快照、WebSocket 推送、盘前盘后数据的边界
人工智能·python·websocket·行情数据 api
装不满的克莱因瓶5 小时前
深入理解卷积神经网络(CNN)——从原理到代码实践
人工智能·神经网络·cnn
完成大叔5 小时前
模块二,Agent知识图谱的工具链思考
人工智能