题目来源:
题目大意:
通过交换两数位置对数列进行排序,求把一串数列化为有序的最小的交换次数。
解题思路:
归并排序求逆序对。
↑虽然是这样说,不过第一次写好痛苦啊忘了考虑一边排完一边还剩这种情况,而且还改一半天都没发现
AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 1010
int ans;
void MergeSort(int l, int r, int c[], int a[])
{
int mid, l1, l2, i=l;
if (l<r)
{
mid = (l+r)/2;
MergeSort(l,mid,c,a);
MergeSort(mid+1,r,c,a);
l1 = l;
l2 = mid + 1;
while(l1<=mid || l2<=r)
{
if (l2>r || (l1<=mid && c[l1]<=c[l2]))
{
a[i] = c[l1];
i++;
l1++;
}
else
{
a[i] = c[l2];
i++;
l2++;
ans += mid+1-l1;
}
}
for (i=l;i<=r;i++)
{
c[i] = a[i];
}
}
}
int main()
{
int T, n, i, cas = 0;
scanf("%d",&T);
while (T--)
{
int c[N], a[N];
printf("Scenario #%d:\n",++cas);
scanf("%d",&n);
ans = 0;
for (i=0;i<n;i++)
{
scanf("%d",&c[i]);
}
MergeSort(0,n-1,c,a);
printf("%d\n",ans);
printf("\n");
}
return 0;
}