Minimum Inversion Number
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 7582 Accepted Submission(s): 4649
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.
AC代碼(暴力實現)
#include<stdio.h>
int a[5003];
int main()
{
int n,i,j,sum;
while(scanf("%d",&n)!=EOF)
{
sum=0;
for(i=1;i<=n;i++)
{
scanf("%d",a+i);
for(j=1;j<i;j++)
if(a[j]>a[i])
sum++;
}
int ans=sum;
for(i=1;i<=n;i++)
{
sum+=(-a[i]+n-a[i]-1);
//交換倆個不相鄰的數a,b(a在前,b在後),逆序數+=兩者間大於a的個數-兩者間大於b的個數!!!
if(sum<ans)
ans=sum;
}
printf("%d\n",ans);
}
return 0;
}