题意是,给一个长度为n的序列(n<=5000),由0~n-1的数字组成。每次把最左边的数挪到最右边形成一个新的序列。那么一共可以形成n个序列。求这n个序列里面最小的逆序数是多少。
我用数组a[0~n-1]来存原始数据。只需求出原始序列的逆序数sum,然后对于a[i](0<= i <n-1),每挪一个,用sum减去挪之前它右边比它小的数的个数(也就是a[i])、再用sum加上挪之后左边比它大的数的个数(也就是n-a[i]-1),就是挪了a[i]的逆序数
source code1暴力法:
#include <iostream>
#include <algorithm>
using namespace std;
int a[5005];
int main()
{
int n;
while (scanf ("%d",&n)!=-1)
{
for (int i=0; i<n; i++)
{
scanf ("%d",&a[i]);
}
int sum=0;
for (int i=0; i<n; i++)
{
for (int j=i+1; j<n; j++)
{
if (a[i]>a[j])
{
sum++;
}
}
}
//printf ("%d/n",sum);
int minn=sum;
for (int i=0; i<n; i++)
{
sum=sum-a[i]+(n-a[i]-1);
//printf ("i=%d,sum=%d/n",i,sum);
minn=min(sum,minn);
}
printf ("%d/n",minn);
}
return 0;
}