1. 程式人生 > >NOI2.4基本演算法之分治 求排列的逆序數 分析----也是醉了...

NOI2.4基本演算法之分治 求排列的逆序數 分析----也是醉了...

剛開始寫部落格,請大家多提意見

一、題目描述

總時間限制: 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儲存。
二、分析
初看此題,我還覺得非常簡單,於是用了選擇排序
#include<cstdio>
int main()
{
	int a[100005]={0},i,n,j;
	long long sum=0;
	scanf("%d"
,&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); } for(i=1;i<n;i++){ for(j=i+1;j<=n;j++){ if(a[i]>a[j]) sum++; } } printf("%lld",sum); }

果不其然,超時了。後來我才發現了題目最後的提示:“利用二分歸併排序演算法(分治);”,當時,我還沒有學分治演算法,就放棄了這一道題。直到學了分治後,把分治排序的程式碼套上去,再提交了一次,居然還是錯的,於是,我就開始檢查我的分治排序演算法... ... ... ... 

兩個小時後,我才看到題目的第二個提示:“注意結果可能超過int的範圍,需要用long long儲存。”... ...


這道題的演算法比較簡單,只需要在分治排序中加一句程式碼就可以了sum=sum+m-i+1;記得把sum定義成long long。

以下程式碼沒有寫主函式。

#include<cstdio>
#include<cstring>
int a[100005],r[100005];
long long sum=0;
void ms(int s,int t){
	int m,i,j,k;
	if(s==t) return;
	m=(s+t)/2;
	ms(s,m);
	ms(m+1,t);
	i=s;
	j=m+1;
	k=s;
	while(i<=m&&j<=t){
		if(a[i]<=a[j]){
			r[k]=a[i];
			i++;
			k++;
		}
		else{
			r[k]=a[j];
			sum=sum+m-i+1;
			j++;
			k++;
		}
	}
	while(i<=m){
		r[k]=a[i];
		//sum=sum+;
		i++;
		k++;
	}
	while(j<=t){
		r[k]=a[j];
		j++;
		k++;
	}
	for(i=s;i<=t;i++)
		a[i]=r[i];
}

相關推薦

NOI2.4基本演算法分治 排列序數 分析----...

剛開始寫部落格,請大家多提意見 一、題目描述 總時間限制: 1000ms 記憶體限制: 65536kB 描述 在Internet上的搜尋引擎經常需要對資訊進行比較,比如可以通過某個人對一

NOI2.4基本演算法分治 統計數字 分析----換一種思路

一、題目描述 總時間限制: 1000ms 記憶體限制: 65536kB描述 某次科研調查時得到了n個自然數,每個數均不超過1500000000(1.5*109)。已知不相同的數不超過10000個

Openjudge NOI題庫2.4基本演算法分治 7620:區間合併

 總時間限制: 1000ms 記憶體限制: 65536kB 描述 給定 n 個閉區間 [ai; bi],其中i=1,2,...,n。任意兩個相鄰或相交的閉區間可以合併為一個閉區間。例如,[1;2] 和 [2;3] 可以合併為 [1;3],[1;3] 和 [2;4] 可以

NOI2.2基本演算法遞迴和自呼叫函式 全排列 分析----如何寫全排列函式

一、題目描述 總時間限制: 1000ms 記憶體限制: 65536kB 描述給定一個由不同的小寫字母組成的字串,輸出這個字串的所有全排列。 我們假設對於小寫字母有'a' < 'b' < ... < 'y' < 'z',而且給定的字串中的字母已經按

Python基本演算法二分法查詢

二分法查詢是比較有序數列的中間值與指定查詢數的大小來找到查詢數下標值的,大大縮短查詢速度 二分法對序列的要求,必須是從小到大的有序數列,下面是兩種方法,一個是普通方法,另外一個是遞迴方法 普通方法: lst = [21, 22, 23, 24, 25, 26, 27,

程式基本演算法習題解析 pi的近似值

思路: pi/4 = 1 - 1/3 +1/5 -1/7 + ... 附上程式碼:  // Chapter5_3.cpp : Defines the entry point for the application. // 求pi的近似值 #include "stdafx.h"

程式基本演算法習題解析 出100之內的所有可逆素數

題目: 可逆素數是指一個素數將其各位數字的順序倒過來構成的反序數也是素數,求出100之內的所有可逆素數。 附上程式碼: // Chapter5_4.cpp : Defines the entry point for the application. // 求出100之內的所有可逆素數 /

python五大基本演算法快速排序

快速排序的思想:首先選取一個基準數(一般為第一個數),然後將比它小得數放到左邊,比它大的數放到右邊,這一個過程稱為一趟快速排序。 一趟快速排序的演算法是: 1)設定兩個變數i、j,排序開始的時候:i=0,j=N-1; 2)以第一個陣列元素作為關鍵資料,賦值給ke

KMP演算法簡單next陣列

前言 1.next陣列的計算只與模式串有關,與主串無關 2.next可能有不同的表示方法,但意義不變 3.字首:除最後一個字母外,前面字母的從前往後組合情況。串abaaba的字首={a,ab,aba,abaa,abaab} 4.字尾:除第一個字母外,後面字母的從前往後組合情況。串

【NOI】2971:抓住那頭牛/ 2.5基本演算法搜尋

2971:抓住那頭牛 檢視 提交 統計 提問 總時間限制:  2000ms   記憶體限制:  65536kB 描述 農夫知道一頭牛的位置,想要抓住它。農夫和牛都位於數軸上,農

[OpenJudge] 2.3基本演算法遞迴變遞推 PKU2506Tiling

一、原題 9273:PKU2506Tiling 總時間限制: 2000ms 單個測試點時間限制: 1000ms 記憶體限制: 131072kB描述 對於一個2行N列的走道。現在用1*2,2*2的磚去鋪

賽馬網基本演算法--馬路上的路燈

題目描述 城市E的馬路上有很多路燈,每兩個相鄰路燈之間的間隔都是1公里。小賽是城市E的領導,為了使E城市更快更好的發展,需要在城市E的一段長度為M的主幹道上的一些區域建地鐵。這些區域要是建了地鐵,就需要挪走相應的路燈。可以把長度為M的主幹道看成一個數軸,一端在數軸0的位置,另一端在M的位置;數軸上的每個

19:裝箱問題(4.6演算法貪心)

19:裝箱問題 總時間限制: 1000ms 記憶體限制: 65536kB 描述 一個工廠製造的產品形狀都是長方體,它們的高度都是h,長和寬都相等,一共有六個型號,他們的長寬分別為1*1, 2*2,

【NOI】1755:菲波那契數列/ 2.2基本演算法遞迴和自呼叫函式

傳送門:檢視 1755:菲波那契數列總時間限制:  1000ms   記憶體限制:  65536kB 描述 菲波那契數列是指這樣的數列: 數列的第一個和第二個數都為1,接下來每個數都等於前面2個數之和。 給出一個正整數a,要求菲波那契數列中第

【NOI】1696:波蘭表示式/ 2.2基本演算法遞迴和自呼叫函式

傳送門:檢視 1696:逆波蘭表示式 總時間限制:  1000ms   記憶體限制:  65536kB 描述 逆波蘭表示式是一種把運算子前置的算術表示式,例如普通的表示式2 + 3的逆波蘭表示法為+ 2 3。逆波蘭表示式的優點是運算子之間

【NOI】2469:電池的壽命/ 4.6演算法貪心

傳送門:檢視 2469:電池的壽命 總時間限制:  1000ms   記憶體限制:  65536kB 描述 小S新買了一個掌上游戲機,這個遊戲機由兩節5號電池供電。為了保證能夠長時間玩遊戲,他買了很多5號電池,這些電池的生產商不同,質量也

【NOI】2407:書架/ 4.6演算法貪心

先獻上傳送門:檢視 2407:書架 總時間限制:  20000ms   單個測試點時間限制:  1000ms   記憶體限制:  65536kB 描述 John最近買了一個書架用來存放奶牛養殖書籍,但書架很

基本演算法思想-分治演算法

package com.xj.www.algo; import java.util.Scanner; /** * 分治演算法 * * @author xiongjing * */ public class DivideTest { static int Fals

二、基本演算法DFS、BFS和A*

         圖中節點的遍歷和搜尋是老生常談的話題,這裡藉由python的networkx庫,複習一下之前的BFS和DFS,並對A*做一些理解。  1.BFS 廣度優先搜尋          其基本思想是優先從當前節點的鄰居節點開始搜尋,如果搜尋不到,再搜尋鄰居的鄰居。

演算法分治策略與應用

歸併排序中我們利用了分治策略,在分治策略中,我們遞迴求解一個問題,在每層遞迴中應用如下三個步驟: 分解:將問題劃分為一些子問題,子問題的形式與原問題一樣,只是規模更小。 解決:遞迴的求解出子問題。如