hdu 1394 Minimum Inversion Number

来源:互联网 发布:战略家炒股软件 编辑:程序博客网 时间:2024/06/06 07:24

转载来自

http://blog.csdn.net/hnust_xiehonghao/article/details/8988809

题意:
一个由0..n-1组成的序列,每次可以把队首的元素移到队尾,
          求形成的n个序列中最小逆序对数目
 
思路:

如果求出第一种情况的逆序列,其他的可以通过递推来搞出来,一开始是t[1],t[2],t[3]....t[N]

它的逆序列个数是N个,如果把t[1]放到t[N]后面,逆序列个数会减少t[1]个,相应会增加N-(t[1]+1)个  


逆序数的定义

在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数



#include <iostream>#include "algorithm"using namespace std;int a[10000];int main() {    int n,i,j;    while(cin>>n)    {        long long f=1000000000;                for(i=0;i<n;i++)            cin>>a[i];        int msum;        msum=0;        for(i=0;i<n;i++)            for(j=i+1;j<n;j++)                if(a[i]>a[j])                    msum++;        if(f>msum)            f=msum;        for(i=0;i<n;i++)        {            msum=msum-2*a[i]+n-1;            if (f>msum) {                f=msum;            }        }        cout<<f<<endl;    }    return 0;}


0 0
原创粉丝点击