http://acm.hdu.edu.cn/showproblem.php?pid=1394
求下列数列中逆序数对最少的一个,并求出逆序数对数量?(n <= 5000)
a1, a2, ..., an-1, an
a2, a3, ..., an, a1a3, a4, ..., an, a1, a2
...
an, a1, a2, ..., an-1
#pragma warning (disable:4786)
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 5000
int arr[MAX + 10];
int main(){
int n,i,j;
while( scanf("%d",&n) != EOF ){
for( i = 0; i < n; i ++ ){
scanf( "%d",&arr[i] );
}
//常规 n^2 方法求逆序数对
int count = 0;
for(i = 0; i < n; i ++){
for( j = i + 1; j < n; j ++ ){
if( arr[i] > arr[j] )
count ++;
}
}
//求出将每一位数移动到最后时较前一个数组的逆序数对数量改变值
int c1, c2,min = count;
for( i =0; i < n; i ++ ){
c1 = 0, c2 = 0;
for( j = 0; j < i; j ++ ){
if( arr[i] > arr[j] )
c1 ++;
else c2 ++;
}
for( j = i + 1; j < n; j ++ ){
if( arr[i] > arr[j] )
c1 ++;
else c2 ++;
}
count = count + c2 - c1;
if( count < min )
min = count;
}
printf("%d\n", min );
}
return 0;
}

1006

被折叠的 条评论
为什么被折叠?



