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;
}
浙公网安备 33010602011771号