zoukankan      html  css  js  c++  java
  • 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];

    }

  • 相关阅读:
    CSS3 target伪类简介
    不用position,让div垂直居中
    css3 在线编辑工具 连兼容都写好了
    a标签伪类的顺序
    oncopy和onpaste
    【leetcode】1523. Count Odd Numbers in an Interval Range
    【leetcode】1518. Water Bottles
    【leetcode】1514. Path with Maximum Probability
    【leetcode】1513. Number of Substrings With Only 1s
    【leetcode】1512. Number of Good Pairs
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290415.html
Copyright © 2011-2022 走看看