百度云服務(wù)器做asp網(wǎng)站免費(fèi)建網(wǎng)站的平臺(tái)
一、第一題:火柴排隊(duì)
解題思路:歸并排序
? ? ? ? 重點(diǎn)在于想清楚是對(duì)哪個(gè)數(shù)組進(jìn)行歸并排序求逆序?qū)?/p>
【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 0mid = (l + r) >> 1res = merge_sort(q, l, mid) + merge_sort(q, mid + 1, r)k, i, j = 0, l, mid + 1while i <= mid and j <= r:if q[i] <= q[j]:tep[k] = q[i]k, i = k + 1, i + 1else:res += mid - i + 1tep[k] = q[j]k, j = k + 1, j + 1while i <= mid:tep[k] = q[i]k, i = k + 1, i + 1while j <= r:tep[k] = q[j]k, j = k + 1, j + 1j = 0for i in range(l, r + 1):q[i] = tep[j]j += 1return res
print( (merge_sort(np,0,n-1))%99999997)
二、第二題:?歸并排序
解題思路:歸并排序
? ? ? ? 歸并排序模板題
【Python程序代碼】
n = int(input())
a = list(map(int,input().split()))
tep = [0]*(n+5)
def merge_sort(q,l,r):if l>=r:returnmid = (l+r)>>1merge_sort(q,l,mid);merge_sort(q,mid+1,r)k,i,j = 0,l,mid+1while i<=mid and j<=r:if q[i]<=q[j]:tep[k] = q[i]k,i=k+1,i+1else:tep[k] = q[j]k,j=k+1,j+1while i<=mid:tep[k]=q[i]k,i=k+1,i+1while j<=r:tep[k]=q[j]k,j=k+1,j+1j = 0for i in range(l,r+1):q[i]=tep[j]j += 1merge_sort(a,0,n-1)
for i in range(n):print(a[i],end=" ")
三、第三題:逆序?qū)Φ臄?shù)量
解題思路:歸并排序
? ? ? ? 歸并排序求逆序?qū)δ0孱}
【Python程序代碼】
n = int(input())
a = list(map(int,input().split()))
tep = [0]*(n+5)
def merge_sort(q,l,r):if l>=r:return 0mid = (l+r)>>1res = merge_sort(q,l,mid)+merge_sort(q,mid+1,r)k,i,j = 0,l,mid+1while i<=mid and j<=r:if q[i]<=q[j]:tep[k] = q[i]k,i=k+1,i+1else:res += mid - i + 1tep[k] = q[j]k,j=k+1,j+1while i<=mid:tep[k]=q[i]k,i=k+1,i+1while j<=r:tep[k]=q[j]k,j=k+1,j+1j = 0for i in range(l,r+1):q[i]=tep[j]j += 1return res
print(merge_sort(a,0,n-1))
?四、第四題:小朋友排隊(duì)
解題思路:歸并排序
? ? ? ? 歸并排序求出每個(gè)數(shù)與其他數(shù)組成的逆序?qū)?shù),然后求和公式累加
【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:returnmid = (l+r)>>1merge(q,l,mid);merge(q,mid+1,r)k,i,j=0,l,mid+1while i<=mid and j<=r:if q[i][0]<=q[j][0]:tep[k]=q[i]sum[q[i][1]] += j-mid-1k,i = k+1,i+1else:tep[k]=q[j]sum[q[j][1]] += mid-i+1k,j = k+1,j+1while i<=mid:tep[k] = q[i]sum[q[i][1]] += j-mid-1k,i = k+1,i+1while j<=r:tep[k] = q[j]k,j = k+1,j+1j = 0for 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)
五、第五題:超快速排序
解題思路:歸并排序
? ? ? ? 歸并排序求逆序?qū)δ0孱}
【Python程序代碼】
import sys
tep = [0] * (500005)
def merge_sort(q,l,r):if l>=r:return 0mid = (l+r)//2res = merge_sort(q,l,mid) + merge_sort(q,mid+1,r)k,i,j = 0,l,mid+1while i<=mid and j<=r:if q[i]<=q[j]:tep[k]=q[i]k,i = k+1,i+1else:tep[k]=q[j]res += mid-i+1k,j = k+1,j+1while i<=mid:tep[k] = q[i]k,i = k+1,i+1while j<=r:tep[k] = q[j]k,j = k+1,j+1j = 0for i in range(l,r+1):q[i] = tep[j]j += 1return 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())