马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 勿语静候 于 2014-10-8 22:04 编辑
题目大意: 给出长度为n的序列,每次只能交换相邻的两个元素,问至少要交换几次才使得该序列为递增序列。
Input 59 1 0 5 4
31 2 3
Output
6
0</blockquote></div></div><p></p><div><div class="blockcode"><blockquote>#include<iostream>
using namespace std;
#define MAXSIZE 500000
long long t;
void merging(int* listL , int listL_size , int* listR , int listR_size)
{
int i , j , k;
i = j = k =0;
int temp[MAXSIZE];
while( i < listL_size && j < listR_size)
{
if( listL[i] > listR[j])
{
temp[k++] = listR[j++];
t+=listL_size - i;
}
else
{
temp[k++] = listL[i++];
}
}
while(i < listL_size)
{
temp[k++] = listL[i++];
}
while(j < listR_size)
{
temp[k++] = listR[j++];
}
for(int m = 0; m < (listL_size + listR_size);m++)
{
listL[m] = temp[m];
}
}
void mergeSort(int* k , int n)
{
if(n > 1)
{
int *listL = k;
int listL_size = n / 2;
int *listR = k + n / 2;
int listR_size = n - listL_size;
mergeSort(listL , listL_size);
mergeSort(listR , listR_size);
merging(listL , listL_size , listR, listR_size);
}
}
int main()
{
int n;
while(cin >> n)
{
t = 0;
int* a = new int[n+1];
for(int i = 0 ; i < n ; i++)
{
cin >> a[i];
}
mergeSort(a,n);
cout << t << endl;
delete a;
}
return 0;
}
|