(1)hdu 1394 Minimum Inversion Number

     这题有人用线段树排序,方正算法要 n(log n) ,我就直接用堆排序来进行找逆序对的个数,因为数的大小在0~ n-1 之间,就能简单的根据它的值判断比它大的数的个数是n-a[i]-1,比它小的个数是a[i]。

View Code
#include<stdio.h>
#include<string.h>
#define size 5005
#define INF 100000000
int a[size],b[size];
int n,sum;

void merge(int p,int q,int r)
{
    int i,j,k;
    int n1,n2;
    int l[size/2+1],ri[size/2+1];
    n1=q-p+1;
    n2=r-q;
    for(i=0;i<n1;i++)
        l[i]=a[p+i];
    for(i=0;i<n2;i++)
        ri[i]=a[q+i+1];
    l[n1]=INF;ri[n2]=INF;
    i=0;j=0;
    for(k=p;k<=r;k++)
    {
        if(l[i]<=ri[j])
        {
            a[k]=l[i];
            i++;
        }
        else
        {
            a[k]=ri[j];
            j++;
            sum+=n1-i;
        }
    }
}

void m_sort(int p,int r)
{
    int q;
    if(r-p==0)
        return;
    q=(r+p)/2;
    m_sort(p,q);
    m_sort(q+1,r);
    merge(p,q,r);
    return ;
}

int main()
{
    int i;
    int min=INF;
//    freopen("test","r",stdin);
    while(scanf("%d",&n)!=EOF)
    {
        sum=0;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            b[i]=a[i];
        }
        m_sort(1,n);
        min=sum;
        for(i=1;i<n;i++)
        {
  //          printf("%d %d %d\n",i,b[i],sum);
            sum=sum+n-b[i]-b[i]-1;
            if(min>sum)
                min=sum;
        }
        printf("%d\n",min);
    }
    return 0;
}

 

 

       

posted @ 2012-09-20 17:11  feng_linxu  Views(142)  Comments(0)    收藏  举报