Freda的越野跑-openjudge    归并算法求逆序对数

描述

Freda报名参加了学校的越野跑。越野跑共有N人参加,在一条笔直的道路上进行。这N个人在起点处站成一列,相邻两个人之间保持一定的间距。比赛开始后,这N个人同时沿着道路向相同的方向跑去。换句话说,这N个人可以看作x轴上的N个点,在比赛开始后,它们同时向x轴正方向移动。
假设越野跑的距离足够远,这N个人的速度各不相同且保持匀速运动,那么会有多少对参赛者之间发生“赶超”的事件呢?

输入

第一行1个整数N。
第二行为N 个非负整数,按从前到后的顺序给出每个人的跑步速度。
对于50%的数据,2<=N<=1000。
对于100%的数据,2<=N<=100000。

输出

一个整数,表示有多少对参赛者之间发生赶超事件。

样例输入

5
1 3 10 8 5

样例输出

7

提示

我们把这5个人依次编号为A,B,C,D,E,速度分别为1,3,10,8,5。
在跑步过程中:
B,C,D,E均会超过A,因为他们的速度都比A快;
C,D,E都会超过B,因为他们的速度都比B快;

C,D,E之间不会发生赶超,因为速度快的起跑时就在前边。

解析:

这道题等价于我们去求整个跑步队列的“顺序对”数目,即先出发的人速度还小的一共有多少对。事实上,这和求逆序对数是一样的方法,只要在输入速度的时候将速度取为相反数就可以实现了。下面我们就按照求逆序对的个数来实现。

下面来看一下实现的细节。

整个的思想是利用归并排序有效利用我们已经计算过的、排过序的结果。利用结果的过程体现在merge操作中,假设在二路归并中,下标较小的子数组是a,下标较大的子数组是b,根据归并排序的性质,此时的a和b都已经是有序的了。那么每次如果在a中发现有某个元素a[i]大于b[j],那么我们知道a[i]后面的a中元素都是大于b[j]的,也就必定和b[j]构成逆序对,我们就只需要在最终的统计结果中加上a[i]和a[i]后面元素的总个数。

下面来看代码:

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
long ans = 0;       //最后记录一共有多少逆序对,注意一共至多10^5个人,所以用long
int speed[N];       //输入的速度
int tmp[N];         //merge中的辅助数组
void merge(int left, int right, int middle) {for (int i = left; i <= right; i++)tmp[i] = speed[i];int index1, index2;index1 = left; index2 = middle + 1;int loc = left;while (index1 <= middle && index2 <= right) {if (tmp[index1] <= tmp[index2])speed[loc++] = tmp[index1++];else {ans += (middle - index1 + 1);  //更新answerspeed[loc++] = tmp[index2++];}}while (index1 <= middle)speed[loc++] = tmp[index1++];while (index2 <= right)speed[loc++] = tmp[index2++];
}
void mergesort(int left, int right) {int middle;if (left < right) {middle = (left + right) / 2;mergesort(left, middle);mergesort(middle + 1, right);merge(left, right, middle);}
}
int main()
{int n; cin >> n;for (int i = 0; i <n; i++) {scanf("%d", &speed[i]);speed[i] = -speed[i];    //将求顺序对转化为求逆序对}mergesort(0, n - 1);cout << ans << endl;return 0;
}

that's all!

Freda的越野跑(openjudge)相关推荐

  1. 青少年软件编程(C语言)等级考试试卷(八级) 2.Freda的越野跑

    Freda报名参加了学校的越野跑.越野跑共有N人参加,在一条笔直的道路上进行.这N个人在起点处站成一列,相邻两个人之间保持一定的间距.比赛开始后,这N个人同时沿着道路向相同的方向跑去.换句话说,这N个 ...

  2. open judge 内排序:Freda的越野跑

    1:Freda的越野跑查看提交统计提问总时间限制: 1000ms 内存限制: 262144kB描述Freda报名参加了学校的越野跑.越野跑共有N人参加,在一条笔直的道路上进行.这N个人在起点处站成一列 ...

  3. 【解题报告】openjudge Freda的越野跑 数据结构与算法mooc 内排序

    描述 Freda报名参加了学校的越野跑.越野跑共有N人参加,在一条笔直的道路上进行.这N个人在起点处站成一列,相邻两个人之间保持一定的间距.比赛开始后,这N个人同时沿着道路向相同的方向跑去.换句话说, ...

  4. poj:Freda的越野跑 求正序对数

    Freda报名参加了学校的越野跑.越野跑共有N人参加,在一条笔直的道路上进行.这N个人在起点处站成一列,相邻两个人之间保持一定的间距.比赛开始后,这N个人同时沿着道路向相同的方向跑去.换句话说,这N个 ...

  5. OpenJudge/Poj 2001 Shortest Prefixes

    1.链接地址: http://bailian.openjudge.cn/practice/2001 http://poj.org/problem?id=2001 2.题目: Shortest Pref ...

  6. OpenJudge/Poj 2027 No Brainer

    1.链接地址: http://bailian.openjudge.cn/practice/2027 http://poj.org/problem?id=2027 2.题目: 总Time Limit: ...

  7. [OpenJudge] 百练2754 八皇后

    八皇后 Description 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. ...

  8. OpenJudge 2739 计算对数

    1.链接地址: http://bailian.openjudge.cn/practice/2739/ 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 给定两个正整数a和b.可 ...

  9. OpenJudge 2757 最长上升子序列 / Poj 2533 Longest Ordered Subsequence

    1.链接地址: http://poj.org/problem?id=2533 http://bailian.openjudge.cn/practice/2757 2.题目: 总Time Limit: ...

最新文章

  1. windows服务器下部署多台tomcat
  2. Oracle下绝对文件号和相对文件号区别
  3. Linux中的 inode以及 软硬链接分析
  4. linux 下载mysql5.7.22
  5. sql使用逻辑控制语句
  6. [******] java多线程连续打印abc
  7. 计算机网络实验——华为ensp安装和初步使用教程
  8. spring-kafka源码解析
  9. Pygame实战之外星人入侵NO.7——大批外星人来袭
  10. linux怎么进sda12,VMare12.0.1安装Ubuntu16.04.2遇到[sda] Assuming drive cache
  11. 群晖日历同步到android,用群晖calander日历做华为手机、ipad、mac三方通讯录和日历同步 2020-12-28...
  12. Echarts柱状图上加图标
  13. PHP 的 SAPI 是个什么东西(转)
  14. Golang DNS 随便写写
  15. 计算机视觉之人脸识别(Yale数据集)--HOG和ResNet两种方法实现
  16. 楚汉骄雄之楚汉争雄 - 分集剧情介绍
  17. 计算机学猫叫音乐,抖音学猫叫音乐 抖音学猫叫什么歌
  18. win 7系统(64位)安装包
  19. CSS相关知识【黑马程序员前端】
  20. Euraka-看这就够了

热门文章

  1. 经纬度换算数值_经纬度转换-----度分秒以及经纬度和米
  2. SpringBoot之RMI的简单使用
  3. Windows安装VMware(Linux系统)
  4. 最新版谷歌浏览器每次都要允许flash解决方法
  5. 微信小程序直播服务器是用的腾讯的,使用微信小程序和腾讯云实现直播功能
  6. 用Python生成动态二维码,只要5行代码,拥有你的个性二维码!
  7. CIC-IDS数据集特征介绍
  8. 【T+】畅捷通T+往来单位档案中默认票据类型设置为“必录”
  9. HTML表格翻页效果-洋葱先生-杨少通
  10. 第三十届香港金像奖(转)