总时间限制:

500ms

内存限制:

65536kB

描述

对于一个长度为N的整数序列A,满足i < j 且 Ai > Aj.的数对(i,j)称为整数序列A的一个逆序

请求出整数序列A的所有逆序对个数

输入

输入包含多组测试数据,每组测试数据有两行
第一行为整数N(1 <= N <= 20000),当输入0时结束
第二行为N个整数,表示长为N的整数序列

输出

每组数据对应一行,输出逆序对的个数

样例输入

5
1 2 3 4 5
5
5 4 3 2 1
1
1
0

样例输出

0
10
0

解题思路详解:

主要用到的算法是归并排序的算法,递归。在归并排序的过程中,通过合并两个小段就能统计出逆序对的个数。例如:1,2,3;1,4;合并,程序流程如下:

1. 初始时刻,pos1=0,pos2=0;都指向两个数组的第一个数,定义一个长度为5的数组temp[5],因为两个数组一共5个数。

2. 1=1;pos1++;temp[0]=1;

3. 2>1; pos2++; temp[1]=1; 这个时候选择了第二个数组的第一个数,且第一个数组有剩余值,说明这些剩余值都将与第二个数组     的第一个数是逆序的,找到2个逆序对。

4. 2<4; pos1++;temp[2]=2;

5. 3<4; pos1++;temp[3]=3;

6. 仅有数值4;pos2++;temp[4]=4;

仔细思考这个流程之后,写出就不是什么难事了,注意,题目给了输出格式要求,必须是每一行一个数,因此要空格,本来一次AC,结果格式错误***。

C++代码

#include <iostream>
#include <vector>
#include <string>
#include <stack>
#include <math.h>
#include <algorithm>
#include <fstream>
#include <map>
using namespace std;

class Solution2_F {
public:
    int Reverse_order() {
        //归并排序
        Merge_sort(0, N - 1);
        return res;
    }
    void Merge_sort(int begin, int end) { //[0,N]闭区间
        if (end == begin) return;
        if (end == begin + 1) {
            if (data[begin] > data[end]) { 
                swap(data[begin], data[end]);
                res++; 
            }
            return;
        }
        int mid = (begin + end) / 2;
        Merge_sort(begin, mid);
        Merge_sort(mid + 1, end);
        Merge(begin, mid - begin + 1, mid + 1, end - mid);
    }
    void Merge(int pos1, int l1, int pos2, int l2) {//pos1开始的l1个数和pos2开始的l2个数合并
        int begin = pos1;
        vector<int> temp(l1 + l2, 0);
        //判断合并过程中出现了几个逆序对
        int pos = 0;
        while (l1 > 0 || l2 > 0) {
            if (l1 > 0 && l2 > 0) {
                if (data[pos1] > data[pos2]) { 
                    temp[pos] = data[pos2]; 
                    pos2++; l2--; 
                    res += l1; 
                }
                else { 
                    temp[pos] = data[pos1]; 
                    pos1++; l1--; 
                }
            }
            else if (l1 > 0 && l2 == 0) { 
                temp[pos] = data[pos1];  
                pos1++; l1--;
            }
            else { 
                temp[pos] = data[pos2]; 
                pos2++; l2--;
            }
            pos++;
        }
        for (int i = begin; i < begin + int(temp.size()); i++) {
            data[i] = temp[i - begin];
        }
    }
    void get_data() {
        cin >> N;
        data = vector<int>(N, 0);
        for (int i = 1; i <= int(data.size()); i++) {
            cin >> data[i - 1];
        }
        res = 0;
    }
    int isOK() { return N != 0; }
private:
    int N;
    vector<int> data;
    int res;
};
int main()
{
    Solution2_F F;
    F.get_data();
    while (F.isOK()) {
        cout << F.Reverse_order() << endl;
        F.get_data();
    }
    return 0;
}

OPJ2018年算法课第二次作业:F.求逆序对数相关推荐

  1. 「数据结构」普林斯顿算法课第二周作业

    「数据结构」普林斯顿算法课第二周作业 Algorithm I, Princeton 编程作业: Deques and Randomized Queues 思路 Deque.java Randomize ...

  2. 「数据结构」普林斯顿算法课第一周作业

    「数据结构」普林斯顿算法课第一周作业 Algorithm I, Princeton 编程作业: Percolation 思路 第一部分代码展示 第二部分代码展示 编程作业: Percolation P ...

  3. Python(分治算法)问题 F: 求逆序对_给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。

    问题 F: 求逆序对 题目描述 给定一个序列a1,a2,-,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目. 注意:n<=10^5,ai<=10^5 ...

  4. 【Web编程实践课第二次作业】体育新闻世界

    夢に敗れた幼き人 被梦想打败的幼稚的人 憧れたヒーローには 是无法变成自己 成れやしないんだ 所憧憬的英雄的 現実に叩き起された時 被现实叫醒的时候 理想郷は離れて 理想的桃花源便会离去 崩れ落ちてき ...

  5. 算法习题---线性表之单链表逆序打印

    一:题目 逆序打印单链表中的数据,假设指针指向单链表的开始结点 二:思路 1.可以使用递归方法,来进行数据打印 2.可以借助数组空间,获取长度,逆序打印数组 3.若是可以,对链表数据使用头插法,逆序排 ...

  6. 《英文科技论文写作与学术报告》网课第二章作业答案

    Lecture 2: Making Presentations in English 2.1 Importance and General Advices 2.2 Instructions on Pr ...

  7. -9 逆序输出一个整数的各位数字_【每日算法】基础算法——归并排序[求逆序对的数量](四)(思想很经典)...

    题目内容 给定一个长度为n的整数数列,请你计算数列中的逆序对的数量. 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆 ...

  8. 归并求逆序对算法图文详解

    给定一个长度为 n 的整数数列,请你计算数列中的逆序对的数量. 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对:否则不是 ...

  9. 算法题12 数组中所有的逆序对

    题目 求一个数组中所有的逆序对数,如数组arr[]={5,2,4,9,8,6,13,14},逆序对有5,2; 5,4; 9,8; 9,6; 8,6; 逆序对数为5 分析 因为数组不是排序的,所以要找一 ...

最新文章

  1. java判斷素數,算法改進 | java語言中判斷素數
  2. python能写软件吗-python代码能做成软件吗
  3. Eclipse中propedit插件安装(解决property中文问题)
  4. 【Ubuntu-ROS】ubuntu16.04(18.04)ROS安装配置与卸载
  5. linux 文件大小_整理 | Linux下列出目录内容命令
  6. swing中模态对话框(setModal(true))和显示对话框(setVisible(true))的编写顺序
  7. 【Python】Matplotlib绘制正余弦曲面图
  8. libevent的vs2013的源码工程 以及两个demo地址
  9. 在线教育软件开发 教育APP软件开发分析
  10. 五大主流浏览器及四大内核
  11. 华东师范大学计算机保研方案,经验分享:华东师范大学的成功保研之路(面试干货)...
  12. javscript创建Emitter
  13. mysql求回购率_用户行为分析——回购率、复购率(SQL、Python求解)
  14. 原神—薄樱初绽时(html+css+js仿原神2.5首页,前端课设)
  15. eMule电驴服务器常见问题及解答
  16. Eclipse设置字体和大小
  17. 俄罗斯自研8核CPU性能实测:能玩几十年前老游戏,下一代「高性能」芯片无人代工...
  18. ECM:发动机和燃烧系统测试设备
  19. HDU1495-非常可乐
  20. 浅谈回车登录的几种方式

热门文章

  1. c语言微博创建转发和删除源代码,[转]QQ空间、新浪微博、腾讯微博等一键分享API链接代码...
  2. Unity打字机效果
  3. 基于Android公交查询系统的设计与实现(论文+程序设计源码+数据库文件)
  4. Java核心编程总结(三、多态与内部类),java就业班百度网盘
  5. Lambda 架构:强大的数据工程方法
  6. php自动生成phpunit,[PHPUnit]自动生成PHPUnit测试骨架脚本
  7. WIN11 CH340驱动配置
  8. zzulioj1123
  9. 计算机和机械课程有关联吗,机械工程及自动化有哪些课程
  10. 【案例练习】15—27个网页设计的 HTML 时间线