一个乱序序列的 逆序数 = 在只允许相邻两个元素交换的条件下,得到有序序列的交换次数
与poj 2299 很像
#include<iostream>
using namespace std;
int number = 0;
void Merge(int r[],int r1[],int s,int m, int t)
{
int i = s;
int j = m+1;
int k = s;
while(i<=m && j<=t)
{
if(r[i] <= r[j] )
r1[k++] = r[i++];
else
{
r1[k++] = r[j++];
number += m-i+1;
}
}
if( i<=m)
while(i<=m)
r1[k++] = r[i++];
else
while(j<=t)
r1[k++] = r[j++];
return;
}
void MergePass(int r[],int r1[],int n,int h)
{
int i=0;
int k;
while(i<=n-2*h)
{
Merge(r,r1,i,i+h-1,i+2*h-1);
i += 2*h;
}
if(i<n-h) Merge(r,r1,i,i+h-1,n-1);
else
for(k = i;k<n;k++)
r1[k] = r[k];
}
void MergeSort(int r[],int n)
{
int h =1;
int i;
int *r1 = (int*)malloc(sizeof(int) * n);
while(h<n)
{
MergePass(r,r1,n,h);
h = 2*h;
MergePass(r1,r,n,h);
h = 2*h;
}
free(r1);
return;
}
int main()
{
int n =0;
int count = 0;
cin>>n;
for(int p = 1; p<=n;p++)
{
count++;
int num;
cin>>num;
int * arr = new int[num];
for(int i= 0;i <num;i++)
cin>>arr[i];
MergeSort(arr,num);
cout<<"Scenario #"<<count<<":"<<endl;
cout<<number<<endl;
cout<<endl;
number = 0;
delete [] arr;
}
system("pause");
return 0;
}