题意如下:
第一行输入一个n
第二行就是 0 1 2 3 4 .......n-1这n个数构成一个初始队列,那么这个初始队列就会有个逆序对数~
逆序对的定义如下: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.
然后每次将队首元素移到队尾构成一个新队列~~~同样这个队列也有逆序对数,
要求最小的逆序对数。。
我们可以先求出最开始的逆序对数,之后的就可以递推出来~~~
我们可以观察出来,假设 有 a[0] a[1] a[2] a[3] a[4]......a[n-1]
其逆序对数为 sum 。 当吧a[0]移到队尾后 , 会减少a[0]个逆序对 同时会增加 (n-1)-a[0]个逆序对。。
附上代码:
#include <iostream>
using namespace std;
int a[5100];
int main()
{
int n;
while(cin>>n)
{
int sum=0,ans=0;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
if(a[j]<a[i])
sum++;
}
ans=sum;
for(int i=0;i<n;i++)
{
sum=sum+n-1-2*a[i];
if(sum<ans)ans=sum;
}
cout<<ans<<endl;
}
return 0;
}