Python(分治算法)问题 F: 求逆序对_给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。
问题 F: 求逆序对
题目描述
给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。
注意:n<=10^5,ai<=10^5
输入
第一行为n,表示序列长度。
接下来的n行,第i+1行表示序列中的第i个数。
输出
所有逆序对总数。
样例输入
4
3
2
3
2
样例输出
3
解答(分治算法):
def merge(a, lt, rt):mid = (lt + rt) // 2x = 0 # 统计逆序对tmp = [0] * (rt - lt + 1)li_1 = []i = lt # 左区间起点j = mid + 1 # 右区间起点k = 0 # 表示第一个数后面的逆序对while mid >= i and j <= rt:if a[i] <= a[j]:tmp[k] = a[i]i += 1else:tmp[k] = a[j]j += 1x += mid - i + 1li_1.append(x)k += 1while mid >= i:tmp[k] = a[i]i += 1k += 1while rt >= j:tmp[k] = a[j]j += 1k += 1for i in range(k):a[lt + i] = tmp[i]return xs = 0def merge1(li, lt, rt):global s # 全局变量sif rt > lt: # lt==rt 表示只有一个数,退出mid = (lt + rt) // 2merge1(li, lt, mid)merge1(li, mid + 1, rt)s += (merge(li, lt, rt))return sn = int(input())
li1 = []
for i in range(n):n1 = int(input())li1.append(n1)print(merge1(li1, 0, len(li1) - 1))
答案不唯一,必定有更加优化的解法欢迎分享
Python(分治算法)问题 F: 求逆序对_给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。相关推荐
- Python(分治算法)问题 E: 解方程_求方程f(x)=2^x+3^x-4^x=0在[1,2]内的根。
问题 E: 解方程 题目描述 求方程f(x)=2^x+3^x-4^x=0在[1,2]内的根. 输入 输入m(0<=m<=8),控制输出精度 输出 三个实根(根与根之间留有空格)输出方程f( ...
- 用python求两个人的平均身高_黄哥Python:分治算法(Divide-and-Conquer)
分治算法(Divide-and-Conquer) 在计算机科学中,分而治之(简称分治法)是基于多分支递归的算法设计范例.分而治之算法的工作原理是将问题递归分解为两个或多个相同或相关类型的子问题,直到这 ...
- python分治算法_黄哥Python:分治算法(Divide-and-Conquer)
分治算法(Divide-and-Conquer) 在计算机科学中,分而治之(简称分治法)是基于多分支递归的算法设计范例.分而治之算法的工作原理是将问题递归分解为两个或多个相同或相关类型的子问题,直到这 ...
- python分治算法_算法-分治
分治算法的基本思想是将一个规模为N的问题分解为K个规模较小的子问题,这些子问题相互独立且与原问题性质相同.求出子问题的解,就可得到原问题的解,是一种分目标完成程序算法,简单的问题可用二分法完成. 1. ...
- python分治算法_python算法实现-分治法
分治法概念将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题----"分" 将最后子问题可以简单的直接求解----"治" 将所有子问 ...
- python分治算法_分治法及其python实现例子
在前面的排序算法学习中,归并排序和快速排序就是用的分治法,分治法作为三大算法之一的,有非常多的应用例子. 分治法概念 将一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题-- ...
- Python(分治算法)问题 G: 剪绳子_有N根绳子,第i根绳子长度为Li,现在需要M根等长的绳子,你可以对N根绳子进行任意裁剪(不能拼接),请你帮忙计算出这M根绳子最长的长度是多少。
问题 E: 解方程 题目描述 有N根绳子,第i根绳子长度为Li,现在需要M根等长的绳子, 你可以对N根绳子进行任意裁剪(不能拼接), 请你帮忙计算出这M根绳子最长的长度是多少. 输入 第一行包含2个正 ...
- python步骤解析 给定一个整数数组和目标值_给定一个整数数组和一个目标值,找出数组中和为目标值的两个数 例如给定nums = [2,7,11,15],target = 9...
python解决方案 nums = [1,2,3,4,5,6] #假如这是给定的数组 target = 9 #假如这是给定的目标值 num_list = [] #用来装结果的容器 def run(nu ...
- python将变量a全部变成大写字母_每天一个Python知识点:只用一招就将所有的英文单词首字母变成大写...
摘要: 将英文单词首字母变成大写是一个古老的话题,很常用,也很简单.不过如何用更简单的方式批量完成这个工作,则有很多学问,不想来看看吗! 将英文单词首字母变成大写是非常常用的文本操作,使用capita ...
最新文章
- 推荐使用的几款Java常用基础工具库
- 10个省时间的 PyCharm 技巧
- mysql5.5以上开启慢查询
- 成功解决xgboost\core.py, ValueError: feature_names may not contain [, ] or
- 阿里云引领云原生进化 | 云原生生态周报 Vol. 60
- 零基础前端入门,真正难在哪里?简说编程思想和逻辑思维
- Android官方开发文档Training系列课程中文版:性能优化建议
- Python GUI程序整理
- Win10在使用setuna2时,启动截屏后屏幕会放大的问题
- 稀疏分解中的MP与OMP算法
- 基于正点原子stm32mini板的串行通信原理
- CentOS使用DNF配置
- 已知棱长求三棱锥的表面积和体积
- 微信公众号文章音视频下载的几种办法-涵盖PC端和手机端
- 【喜讯】PerfMa再获高瓴创投领投1.5亿A++轮融资
- python类的封装是什么意思_python类封装 python中将函数和变量封装成类的好处
- Bootstrap学习笔记——缩略图、警示框、进度条、媒体对象、列表组、画板
- uni-app小程序 阿里巴巴字体图标兼容ios
- IOS 实现植物大战僵尸
- 图像轮廓生成Freeman码