杭电ACM1394——Minimum Inversion Number

来源:互联网 发布:qq会员永久软件 编辑:程序博客网 时间:2024/06/07 02:30

题目的意思:给你一个数组,求最小的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;}


1 0
原创粉丝点击