• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

  • 联系
  • 订阅
  • 管理

View Post

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;
}

posted on 2010-12-21 22:58  sysuwhj  阅读(582)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3