题目的意思:给你一个数组,求最小的Inversion Number。所谓的Inversion Number是 数组中 i < j && a[ i ] > a[ j ] 的对数。数组可以滚动,也就是相当于环状的,每一个数都可以当作起始位置。
这题,暴力可以直接过,接近300MS。
下面的是AC的代码:
#include <iostream>
#include <cstring>
using namespace std;
int D[5005];
int main()
{
int n, i, j, ans, res;
while(cin >> n)
{
res = 0;
for(i = 0; i < n; i++)
cin >> D[i];
for(i = 0; i < n - 1; i++)
{
ans = 0;
for(j = i + 1; j < n; j++)
{
if(D[i] > D[j])
ans++;
}
res += ans;
} //算出一开始的数组的最小的Inversion Number数。
int min = res;
for(i = 0; i < n; i++)
{
res = res - D[i] + (n - 1) - D[i]; //因为数组中的数是0~n - 1的。
if(min > res) //所以将第一个放在数组末,Inversion Number的个数就是
min = res; //相当于减掉D【i】(有D【i】个比它本身大的数),
} //同理加上(n-1)-D【i】
cout << min << endl;
}
return 0;
}