现在的位置: 首页 > 综合 > 正文

hdu-1394-逆序数

2014年01月03日 ⁄ 综合 ⁄ 共 515字 ⁄ 字号 评论关闭

又有一段时间没怎么写博客了。是不是连这么点时间也要节约。。额。。

所谓的逆序数就是前面的数比后面的要大,在一个排列中,所有逆序数的总和就是这个排序的逆序数

比如: 2  3 4 1,逆序数有 21,,31,41,所以逆序数就是3

关键是怎么求出n个数的逆序数:

1.先求出中的逆序数

2.每次把最后面的往前调,逆序数减少 n - 1 - a[i], 增加 a[i];

详见代码:

#include <cstdio>
#include <algorithm>
#include <iostream>

using namespace std;

int a[5050];
int main() {
	int n, sum;
	while(scanf("%d", &n) !=EOF) {
		sum=0;
		for (int i = 1; i <= n; i ++)
			scanf("%d", &a[i]);
		for (int j = 1; j <= n; j ++) {
			for (int k = j + 1; k <= n; k ++) {
				if(a[j] > a[k])
					sum ++;
			}
		}
		int ans = sum;
		for(int t = n; t >= 1; t --) {
			sum -= (n - 1 - a[t]);
			sum += a[t];
			if(ans > sum)
				ans = sum;
		}
		printf("%d\n", ans);
	}
	return 0;
}

抱歉!评论已关闭.