北京大學openjudge 07 求排列的逆序數

2021-08-22 10:29:47 字數 1283 閱讀 8750

總時間限制: 

1000ms

記憶體限制: 

65536kb

描述在internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一些事物的排名來估計他(或她)對各種不同資訊的興趣,從而實現個性化的服務。

對於不同的排名結果可以用逆序來評價它們之間的差異。考慮1,2,…,n的排列i1,i2,…,in,如果其中存在j,k,滿足 j < k 且 ij > ik, 那麼就稱(ij,ik)是這個排列的乙個逆序。

乙個排列含有逆序的個數稱為這個排列的逆序數。例如排列 263451 含有8個逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此該排列的逆序數就是8。顯然,由1,2,…,n 構成的所有n!個排列中,最小的逆序數是0,對應的排列就是1,2,…,n;最大的逆序數是n(n-1)/2,對應的排列就是n,(n-1),…,2,1。逆序數越大的排列與原始排列的差異度就越大。

現給定1,2,…,n的乙個排列,求它的逆序數。

輸入第一行是乙個整數n,表示該排列有n個數(n <= 100000)。

第二行是n個不同的正整數,之間以空格隔開,表示該排列。

輸出輸出該排列的逆序數。

樣例輸入

6

2 6 3 4 5 1

樣例輸出

8
提示

1. 利用二分歸併排序演算法(分治);

2. 注意結果可能超過int的範圍,需要用long long儲存。

**習題(15-4)

#includeusing namespace std;

long long cnt;

void marge(long long a,int s,int m,int e,long long tmp)else

}while(p1<=m)

tmp[pb++]=a[p1++];

while(p2<=e)

tmp[pb++]=a[p2++];

for(int i=0;i思考:歸併排序「分的操作」,我前面已經寫過了,不再贅述

這裡重點說一下marge函式

在確定中點值m後,分別以s和m+1做p1和p2的起點,進行查詢

如果查詢到p1<=m&&p2<=e和a[p1]<=a[p2],就說明滿足逆序數的要求,就收納到臨時陣列.。

逆序數的個數是m-p1+1;

而搜尋完這些還沒有完成,還存在上面的while滿足而某一部分當中還存在逆序數的情況,因此要左右部分各自進行while迴圈,記錄下數量,輸出數量,程式完成。

注:部分講解思想源自郭煒老師的暑假acm課程課件。

北京大學OpenJudge 3468 電池的壽命

總時間限制 1000ms 記憶體限制 65536kb 描述小s新買了乙個掌上遊戲機,這個遊戲機由兩節5號電池供電。為了保證能夠長時間玩遊戲,他買了很多5號電池,這些電池的生產商不同,質量也有差異,因而使用壽命也有所不同,有的能使用5個小時,有的可能就只能使用3個小時。顯然如果他只有兩個電池乙個能用5...

北京大學OpenJudge 2815 城堡問題

總時間限制 1000ms 記憶體限制 65536kb 描述1 2 3 4 5 6 7 1 2 3 4 圖 1 wall no wall no wall 圖1是乙個城堡的地形圖。請你編寫乙個程式,計算城堡一共有多少房間,最大的房間有多大。城堡被分割成m n m 50,n 50 個方塊,每個方塊可以有0...

蓋茨北京大學演講

大家早上好!微軟認為計算將是個人的,所有的人們創造出來工具,在所有的工具中個人電腦將是重要的一點,它能夠為人們提供溝通以及製造,做生意的全新的方式,這些充滿了好奇心的學生,更好地獲取各種各樣的資訊,讓他們找到自己問題的答案。在過去的30年中,確實是令人難以置信的。我們看到計算以後的方式發展,在30多...