• 45.分支算法练习:  7622:求排列的逆序数



    总时间限制: 

    1000ms

     

    内存限制: 

    65536kB

    描述

    Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务。

    对于不同的排名结果可以用逆序来评价它们之间的差异。考虑1,2,…,n的排列i1i2in,如果其中存在j,k,满足 j < k  ij > ik 那么就称(ij,ik)是这个排列的一个逆序。

    一个排列含有逆序的个数称为这个排列的逆序数。例如排列 263451 含有8个逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是8。显然,由1,2,…,n 构成的所有n!个排列中,最小的逆序数是0,对应的排列就是1,2,…,n;最大的逆序数是n(n-1)/2,对应的排列就是n,(n-1),…,2,1。逆序数越大的排列与原始排列的差异度就越大。

    现给定1,2,…,n的一个排列,求它的逆序数。

    输入

    第一行是一个整数n,表示该排列有n个数(n <= 100000)
    第二行是n个不同的正整数,之间以空格隔开,表示该排列。

    输出

    输出该排列的逆序数。

    样例输入

    
    6
    
    
    2 6 3 4 5 1
    

    样例输出

    
    8
    

    提示

    1. 利用二分归并排序算法(分治);
    2.
    注意结果可能超过int的范围,需要用long long存储。

    代码:

    #include

    using namespace std;

    #include

    #include

    #define maxn 100001//数组要开够

    int n,a[maxn],r[maxn];

    long long sum=0;

    void gb(int,int);

    int main()

    {

           cin>>n;

           for(int i=1;i<=n;++i)

           scanf("%d",&a[i]);

           gb(1,n);

           cout<<sum;

           return 0;

     }

    void gb(int s,int t)

    {

           if(s==t) return ;

           int mid=(s+t)/2;

           gb(s,mid);

           gb(mid+1,t);

           int k=s,i=s,j=mid+1;

           while(i<=mid&&j<=t)

           {

                  if(a[i]>a[j])

                  {

                         r[k]=a[j];

                         k++;j++;

                         sum+=mid-i+1;

                  }

                  else {

                         r[k]=a[i];

                         k++;i++;

                  }

           }

           while(i<=mid) {

                  r[k]=a[i];

                  i++;k++;

           }

           while(j<=t)

           {

                  r[k]=a[j];

                  k++;

                  j++;

           }

           for(int q=s;q<=t;++q)

           a[q]=r[q];

    }

  • 相关阅读:
    Delphi Try Except 实例
    如何有效地让一个“ParentFont = False”子控件使用与父母相同的字体名称?
    WPF的本质:数据和行为
    WPF-触发器
    WPF TextBox 验证输入
    wpf数据绑定更新通知
    asp.net *.ashx类型的文件使用说明
    asp.net 定时间点执行任务的简易解决办法
    asp.net 页面延时五秒,跳转到另外的页面
    Asp.net 基于Cookie简易的权限判断
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290414.html
Copyright © 2020-2023  润新知