题目:TOJ 1455 统计将一个序列排列为非递减序列所需的最小交换次数。
分治:归并排序
#include <iostream>
using namespace std;
int arr[1000],narr[1000];
int cnt;
void mergeSort(int s,int e){
if(e-s==1)
return;
int m=(s+e)/2;
mergeSort(s, m);
mergeSort(m, e);
int i=s,j=m,n=s;
while(i<m&&j<e){
if(arr[j]<arr[i]){
narr[n++]=arr[j++];
cnt+=m-i;
}else{
narr[n++]=arr[i++];
}
}
for( ;i<m;i++)
narr[n++]=arr[i++];
for( ;j<e;j++)
narr[n++]=arr[j++];
memcpy(arr+s,narr+s,sizeof(int)*(e-s));
}
int main(){
int N;
while(cin>>N && N){
for(int i=0;i<N;i++)
cin>>arr[i];
cnt=0;
mergeSort(0, N);
cout<<cnt<<endl;
}
return 0;
}