HDU 1394 Minimum Inversion Number 逆序数
杭电这题,也是逆序数,规模比poj小很多,可以不用归并,直接暴力统计。
这题要求最小的逆序数,开始每次序列都重新用归并算一次,发现超时了,后来看了别人解题报告发现原来可以利用一开始计算的那个逆序数。这题比较特别,输入的n个数是0~n-1的。
从该数字hold[i]就可以知道比它小的数有hold[i]个,比它大的数有n-1-hold[i]个.
每次把hold[i]放到最后时,ans = ans – hold[i] + n-1-hold[i];
#include <iostream> #include <cstring> #include <cstdio> #define MAX 500005 using namespace std; long long tmp[MAX]; long long hold[MAX]; long long array[MAX]; long long ans; int num[MAX]; int main() { int n; while (cin >> n) { for (int i = 0; i < n; i++) { scanf("%lld", &hold[i]); array[i] = hold[i]; } ans = 0; memset(num, 0, sizeof(num)); for (int i = 0; i < n; i++) { for (int j = i+1; j < n; j++) if (array[i] > array[j]) num[i]++; ans += num[i]; } long long _min = ans; for ( int i = 0; i < n-1; i++) { ans = ans - hold[i] + (n - 1)-hold[i]; if (_min > ans) _min = ans; } cout << _min << endl; } return 0; }