The inversion number 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.
InputThe 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 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.
OutputFor each case, output the minimum inversion number on a single line.
Sample Input
10 1 3 6 9 0 8 5 7 4 2Sample Output
16
最开始以为用简单得暴力就可以写出来,后面发现暴力直接超时,其实这道题有好一点得方法,不过现阶段水平不高,只能想出这个办法,先计算出第一个数得逆序数,然后从一开始循环,记录每一次的第一个数的逆序数,用前一个数的逆序数减去当前第一个数字的逆序数,再看这个数后面有多少比这个数大的数,再减去比他大的数的个数,就是当前这个序列的逆序数,但是时间复杂度也是O(n2),水过。
#include<bits/stdc++.h>
using namespace std;
int ar[10010];
int main()
{
int n,i,j,k,l,ans,t,sum,min1;
while(scanf("%d",&n)!=EOF)
{
min1=999999;
sum=0;
ans=0;
t=0;
for(i=1;i<=n;i++)
{
scanf("%d",ar+i);
}
j=1;
for(i=n+1;i<=2*n;i++)
{
ar[i]=ar[j];
j++;
}
sum=0;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if(ar[i]>ar[j])
{
sum++;
}
}
}
min1=min(min1,sum);
l=n;
for(i=1;i<=n;i++)
{
for(j=i+1;j<=l;j++)
{
if(ar[i]>ar[j])
{
ans++;
}
}
for(j=i+1;j<=l;j++)
{
if(ar[j]>ar[i])
{
t++;
}
}
sum=sum-ans+t;
min1=min(min1,sum);
t=0;
ans=0;
l++;
}
printf("%d\n",min1);
}
return 0;
}