您的位置:首页 > 其它

杭电ACM1394——Minimum Inversion Number

2015-08-07 22:38 246 查看
题目的意思:给你一个数组,求最小的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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: