这题和poj2299是一样的。而且测试数据还没那么强。当刷题吧~
#include <iostream> #include <fstream> using namespace std; int a[1005],t[1005]; //t[]为暂存数组 int cnt; void Merge(int l,int m,int r) { int i=l,j=m+1,k=0; while(i<=m && j<=r) { if(a[i]>a[j]) { cnt+=m-i+1; //a[j]是i以及i后面的逆序数 t[k++]=a[j++]; } else { t[k++]=a[i++]; } } while(i<=m) t[k++]=a[i++]; while(j<=r) t[k++]=a[j++]; //复制回原来数组 for(i=0; i<k; i++) { a[l+i]=t[i]; } } void MergeSort(int l,int r) { int mid=(l+r)/2; if(l<r) { MergeSort(l,mid); MergeSort(mid+1,r); Merge(l,mid,r); } } int main() { int n,m,i,k; freopen("acm.txt","r",stdin); scanf("%d",&n); for(k=0; k<n; k++) { scanf("%d",&m); for(i=0; i<m; i++) { scanf("%d",&a[i]); } cnt=0; MergeSort(0,m-1); printf("Scenario #%d:\n",k+1); printf("%d\n",cnt); printf("\n"); } return 0; }