Description
小张在暑假时间来到工地搬砖挣钱。包工头交给他一项艰巨的任务,将一排砖头按照从低到高的顺序排好。可是小张的力量有限,每次只能交换相邻的两块砖头,请问他最少交换几次能够完成任务?
Input
第一行一个整数
,表示砖头数量。
第二行
个整数
,表示砖头的高度。
Output
一个整数,表示最少交换几次能够完成任务。
代码如下:
#include <stdio.h>
long long A[300002];
long long B[300002];
long long record=0;
void Sort(long L,long R,long long A[],long long B[])
{
if(R-L>0)
{
long Mid=(L+R)/2,i=L,p=L;
long q=Mid+1;
Sort(L,Mid,A,B);Sort(Mid+1,R,A,B);
while(p<=Mid||q<=R)
{
if(R>=q&&(p>Mid||A[p]>A[q]))
{
B[i++]=A[q++];
record+=Mid-p+1;
}
else B[i++]=A[p++];
}
for(i=L;i<=R;i++)
A[i]=B[i];
}
}
int main()
{
long n,i;
scanf("%ld",&n);
for(i=0;i<n;i++) scanf("%lld",&A[i]);
Sort(0,n-1,A,B);
printf("%lld\n",record);
}