ACM: 序列中找最小逆序对 杂题 TOJ…
2016-05-19 23:19
375 查看
Minimum Inversion Number
描述
The inversionnumber of a given number sequence a1, a2, ..., an is the number of
pairs (ai, aj) that satisfy i < j and ai
> aj.
For a given sequence of numbers a1, a2, ..., an, if we move the
first m >= 0 numbers to the end of the seqence, we
will obtain another sequence. There are totally n such sequences as
the following:
a1, a2, ..., an-1, an (where m = 0 - the initial seqence)
a2, a3, ..., an, a1 (where m = 1)
a3, a4, ..., an, a1, a2 (where m = 2)
...
an, a1, a2, ..., an-1 (where m = n-1)
You are asked to write a program to find the minimum inversion
number out of the above sequences.
输入
The input
consists of a number of test cases. Each case consists of two
lines: the first line contains a positive integer n (n
<= 5000); the next line contains a permutation of
the n integers from 0 to n-1.
输出
For each
case, output the minimum inversion number on a single
line.
样例输入
10
1 3 6 9 0 8 5
7 4 2
样例输出
16
题意:
在规定的变化序列中找出最少逆序对的个数.
解题思路:
1. 先计算出初始序列的逆序对的个数.
2. 再计算把当前序列最后一个数放到最前面的时候逆序对变化.
问题分析: 假设 sum 表示当前序列的逆序对数.
num表示当前序列最后一个数.
要计算变化的情况首先, 假设最坏的情况. 即: sum -= (n-1);
再
sum += (num的逆序对)*2
3. 不断更新最小值.
代码:
#include
<cstdio>
#include <iostream>
#include <cstring>
using namespace std;
#define MAX 5005
int n;
int sum;
int minsize;
int a[MAX];
int
main()
{
freopen("input.txt","r",stdin);
int i, j;
while(scanf("%d",&n) !=
EOF)
{
sum = 0;
for(i = 0; i <
n; ++i)
scanf("%d",&a[i]);
for(i = 0; i <
n; ++i)
{
for(j = i+1;
j < n; ++j)
{
if(a[i]
> a[j])
sum++;
}
}
minsize = sum;
for(i = n-1; i >
0; --i)
{
sum = (sum -
(n-1));
sum = (sum +
(a[i]*2));
if(minsize
> sum)
minsize
= sum;
}
printf("%d\n",minsize);
}
return 0;
}
相关文章推荐
- mapReduce概念及用法
- ACM: 简单最小生成树 图论题 poj 1…
- ACM: spfa+dfs 图论题 poj 2679
- 图论: 最大流
- ACM: 最大流 图论题 poj 1797
- 线程的常用方法
- ACM: 差分约束 图论题 poj 2983 sp…
- ACM: 二分图最大匹配 hdu 2063
- 数据
- ACM: 二分法 数论题 poj 1905
- ZOJ的轻松ACMER语录.. 狗一样的学…
- ACM: spfa求解 图论题 (对差分约束…
- ACM: 最小费用用最大流 图论题 poj…
- ACM: K次最小费用最大流 图论题 po…
- ACM: 哈希暴力求解 哈希题 poj 184…
- ACM: 最小费用最大流 图论题 poj 2…
- 理解并解决GBK转UTF-8奇数中文乱码(转)
- HDU 2098 分拆素数和
- ACM: hash题 poj 2503
- ACM: 网络流 图论 poj 1459