日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

-9 逆序输出一个整数的各位数字_【每日算法】基础算法——归并排序[求逆序对的数量](四)(思想很经典)...

發(fā)布時間:2023/12/10 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 -9 逆序输出一个整数的各位数字_【每日算法】基础算法——归并排序[求逆序对的数量](四)(思想很经典)... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目內(nèi)容

給定一個長度為n的整數(shù)數(shù)列,請你計算數(shù)列中的逆序?qū)Φ臄?shù)量。

逆序?qū)Φ亩x如下:對于數(shù)列的第 i 個和第 j 個元素,如果滿足 i < j 且 a[i] > a[j],則其為一個逆序?qū)?#xff1b;否則不是。

輸入格式

第一行包含整數(shù)n,表示數(shù)列的長度。

第二行包含 n 個整數(shù),表示整個數(shù)列。

輸出格式

輸出一個整數(shù),表示逆序?qū)Φ膫€數(shù)。

數(shù)據(jù)范圍

1≤n≤100000

輸入樣例

6

2 3 4 5 6 1

輸出樣例

5

題解

整個題根據(jù)歸并排序算法+分治的思想來求解。

我們將整個序列均分成前后兩個部分。將所有的逆序?qū)Ψ殖梢韵氯N情況,分別是:

  • 逆序?qū)χ械膬蓚€數(shù)在前一個區(qū)間

  • 逆序?qū)χ械膬蓚€數(shù)在后一個區(qū)間

  • 逆序?qū)χ械膬蓚€數(shù)一個數(shù)在前一個區(qū)間,一個數(shù)在后一個區(qū)間。

當然,這里需要說明一個問題,那就是前兩種情況其實在遞歸中轉(zhuǎn)化為了第三種情況,比如有個逆序?qū)υ谇耙粋€區(qū)間里,當進行遞歸之后,這兩個數(shù)字最終會被切割成兩個區(qū)間的數(shù)字,變?yōu)榈谌N情況,基于此,題目的代碼只需要編寫對第三種的情況就可,這種結(jié)合很巧妙。同時,merge_sort函數(shù)的返回定義為逆序?qū)Φ臄?shù)量,因此,左右兩邊是個子問題,所以兩個函數(shù)遞歸完就可以求出左右兩個區(qū)間內(nèi)部的逆序?qū)?shù)了。由于歸并排序的過程中對序列進行了排序,因此前一個區(qū)間中的i代表的數(shù)若大于后一個區(qū)間j代表的數(shù),那么此時針對j代表的數(shù)的逆序?qū)Φ臄?shù)量為mid-i+1。

需要注意的點

由于數(shù)據(jù)范圍是10萬,逆序?qū)Φ臄?shù)量最多為 10^5x(10^5 -1)/2,大概是 5x10^9 ,這個數(shù)值大于int的最大值,因此在代碼層面,需要用long long類型來進行求解。

代碼實現(xiàn)

#include using namespace std;typedef long long LL;const int N = 100010;int n;int q[N],tmp[N];LL merge_sort(int l , int r){ if (l>=r) return 0; #遞歸結(jié)束的標志 int mid = l+r>>1; # 去中間的位置 LL res = merge_sort(l, mid) + merge_sort(mid+1, r); # 進行遞歸,將一個大問題編程兩個子問題求解,同時返回值是前后兩個區(qū)間內(nèi)部的逆序?qū)Φ臄?shù)量。 //歸并過程 int k = 0, i = l, j = mid + 1; while (i <= mid && j <= r) if (q[i] <= q[j]) tmp[k++] = q[i++]; # 當q[i]小于q[j],則不作處理 else{ tmp[k++] = q[j++]; res += mid-i+1; # 當q[i]大于q[j],則說明i后的全部數(shù)字大于q[j],因此針對q[j]來說,逆序?qū)?shù)量為mid-i+1 } //掃尾 while(i<=mid) tmp[k++] = q[i++]; # 此時的情況說明上面的while是后面的區(qū)間遍歷完成,前面的區(qū)間仍然沒有遍歷完,因此需要對前面的區(qū)間進行掃尾工作。 while(j<=r) tmp[k++] = q[j++]; # 反之亦然 for (int i=l, j=0; i<=r; i++,j++) q[i]=tmp[j]; # 將臨時數(shù)組的排列后的有序數(shù)組存入q中,保證遞歸循環(huán)后的q的前后兩個區(qū)間內(nèi)部有序。 return res;}int main(){ cin >> n; for(int i = 0; i < n; i++) cin >> q[i]; cout << merge_sort(0,n-1)<< endl; return 0;}

總結(jié)

以上是生活随笔為你收集整理的-9 逆序输出一个整数的各位数字_【每日算法】基础算法——归并排序[求逆序对的数量](四)(思想很经典)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。