题目跟POJ2299差不多,只不过数据集变小了,用冒泡排序也可以。 // 204k 204ms #include <iostream> using namespace std; const int inf = 1000001; int ans; // 逆序数 void combine(int *a, int top, int mid, int end) { int len1 = mid-top+1; int len2 = end-mid; int *left = new int[len1+2]; int *right = new int[len2+2]; int i, j, k; for (i = 1; i <= len1; ++i) left[i] = a[top-1+i]; left[len1+1] = inf; //inf数参照,必须要加 for (j = 1; j <= len2; ++j) right[j] = a[mid+j]; right[len2+1] = inf; i = j = 1; for (k=top; k <= end; ) { if (left[i] <= right[j]) { a[k++] = left[i++]; } else { a[k++] = right[j++]; ans += len1-i+1; //要交换大数的交换次数 } } delete left; delete right; } void mergeSort(int *a, int top, int end) { if (top < end) { int mid = (top+end) / 2; mergeSort(a, top, mid); mergeSort(a, mid+1, end); combine(a, top, mid, end); } } int main() { freopen("temp.txt", "r", stdin); int cases, n, num = 0; cin >> cases; while (cases--) { cin >> n; ans = 0; int *a = new int[n+1]; for (int i = 1;i <= n; ++i) cin >> a[i]; mergeSort(a, 1, n); cout << "Scenario #" << ++num << ":" <<endl; cout << ans << endl << endl; delete a; } return 0; }