【算法训练营】最小交换,楼尔邦德,最短路(python实现)

最小交换


时间限制:4 sec

空间限制:256 MB

问题描述

给定一个 1 到 n 的排列(即一个序列,其中 [1,n] 之间的正整数每个都出现了恰好 1 次)。

你可以花 1 元钱交换两个相邻的数。

现在,你希望把它们升序排序。求你完成这个目标最少需要花费多少元钱。

输入格式

第一行一个整数 n,表示排列长度。

接下来一行 n 个用空格隔开的正整数,描述这个排列。

输出格式

输出一行一个非负整数,表示完成目标最少需要花多少元钱。

样例输入

3
3 2 1

样例输出

3

样例解释

你可以:

花 1 元交换 1,2,序列变成 3 1 2

花 1 元交换 1,3,序列变成 1 3 2

花 1 元交换 2,3,序列变成 1 2 3

总共需要花 3 元。

可以证明不存在更优的解。

数据范围

对于 20% 的数据,保证 n<=7。

对于 60% 的数据,保证 n<=1,000。

对于 100% 的数据,保证 n<=200,000。

提示

[每次交换相邻的两个数都会使逆序对 +1 或 -1。]

[逆序对数目不为零时,一定存在相邻的逆序对。]

[因此最优策略显然是每次都让逆序对数目 -1。]

[所以答案即为逆序对数目。]

[朴素的算法时间复杂度是 O(n^2) 的。]

[用归并排序求逆序对数可以通过本题。需要提醒的是,答案可能超过 32 位整数的范围哦。]

[逆序对数目同样可以用树状数组优化朴素的 O(n^2) 算法,并获得和归并排序相同的时间复杂度。有兴趣的同学可以自行学习。]

代码实现 

def merge_and_count(arr, left, mid, right):i, j, k = left, mid + 1, 0count = 0temp = [0] * (right - left + 1)while i <= mid and j <= right:if arr[i] <= arr[j]:temp[k] = arr[i]i += 1else:temp[k] = arr[j]count += mid - i + 1  # 计算逆序对数量j += 1k += 1while i <= mid:temp[k] = arr[i]i += 1k += 1while j <= right:temp[k] = arr[j]j += 1k += 1for i in range(len(temp)):arr[left + i] = temp[i]return countdef merge_sort_and_count(arr, left, right):count = 0if left < right:mid = (left + right) // 2count += merge_sort_and_count(arr, left, mid)count += merge_sort_and_count(arr, mid + 1, right)count += merge_and_count(arr, left, mid, right)return countdef min_swaps(arr):return merge_sort_and_count(arr, 0, len(arr) - 1)# 读取输入
n = int(input())
arr = list(map(int, input().split()))# 计算最少花费的元钱
result = min_swaps(arr)
print(result)

楼尔邦德


时间限制:2 sec

空间限制:256 MB

问题描述

给定包含 n 个数的序列 A。

再给出 Q 个询问,每个询问包含一个数 x,询问的是序列 A 中不小于 x 的最小整数是多少(无解输出-1)。

输入格式

第一行一个数 n,表示序列长度。

第二行 n 个用空格隔开的正整数,描述序列中的每一个元素。保证这些元素都不会超过 10^9。

第三行一个正整数 Q,表示询问个数。

接下来 Q 行,每行一个正整数 x,描述一个询问。

输出格式

输出 Q 行依次回答 Q 个询问,每行一个正整数,表示对应询问的答案。

样例输入

3
3 2 5
6
1
2
3
4
5
6

样例输出

2
2
3
5
5
-1

数据范围

对于 50% 的数据,保证 n<=2000。

对于 100% 的数据,保证 n<=300,000。

提示

[如果我们先将原序列排序,那么我们就可以在它上面进行二分查找啦!]

[STL库中有二分查找的函数__std::lower_bound__,你可以学习一下它的使用。当然啦,作为初学者,还是建议自己实现二分查找哦!]

 代码实现

def binary_search(arr, target):low, high = 0, len(arr) - 1result = -1while low <= high:mid = (low + high) // 2if arr[mid] >= target:result = arr[mid]high = mid - 1else:low = mid + 1return resultdef main():# 读取输入n = int(input())sequence = list(map(int, input().split()))q = int(input())# 对序列进行排序sorted_sequence = sorted(sequence)# 处理每个查询for _ in range(q):x = int(input())# 使用二分查找找到不小于 x 的最小整数result = binary_search(sorted_sequence, x)# 输出答案print(result)if __name__ == "__main__":main()

最短路


时间限制:4 sec

空间限制:256 MB

问题描述

给定一张 n 个点的无向带权图,节点的编号从 1 至 n,求从 S 到 T 的最短路径长度。

输入格式

第一行 4 个数 n,m,S, T,分别表示点数、边数、起点、终点。

接下来 m 行,每行 3 个正整数 u,v,w,描述一条 u 到 v 的双向边,边权为 w。

保证 1<=u,v<=n。

输出格式

输出一行一个整数,表示 S 到 T 的最短路。

样例输入

7 11 5 4
2 4 2
1 4 3
7 2 2
3 4 3
5 7 5
7 3 3
6 1 1
6 3 4
2 4 3
5 6 3
7 2 1

样例输出

7

样例文件下载(包含第二个样例)

数据范围

本题共设置 12 个测试点。

对于前 10 个测试点,保证 n<=2500,m<=6200,对于每条边有 w<=1000。这部分数据有梯度。

对于所有的 12 个测试点,保证 n<=100,000,m<=250,000。

提示

[本题是 Dijkstra 算法的模板练习题。]

[使用朴素的 Dijkstra 算法可以通过前 10 个测试点。]

[使用堆或__std::priority_queue__优化的 Dijkstra 算法可以通过所有测试点。]

代码实现 

import heapqdef dijkstra(graph, start, end):n = len(graph)dist = [float('inf')] * ndist[start - 1] = 0pq = [(0, start)]while pq:curr_dist, node = heapq.heappop(pq)if curr_dist > dist[node - 1]:continuefor neighbor, weight in graph[node]:new_dist = curr_dist + weightif new_dist < dist[neighbor - 1]:dist[neighbor - 1] = new_distheapq.heappush(pq, (new_dist, neighbor))return dist[end - 1]# 读取输入
n, m, s, t = map(int, input().split())
graph = {i: [] for i in range(1, n + 1)}for _ in range(m):u, v, w = map(int, input().split())graph[u].append((v, w))graph[v].append((u, w))# 调用 Dijkstra 算法求最短路径
result = dijkstra(graph, s, t)# 输出结果
print(result)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/703836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何本地部署LightPicture结合cpolar内网穿透打造个人云图床

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…

还不知道随身WiFi这个蓝海市场怎么做?这个一定要看!适合30-40岁轻资产小生意

有没有发现你身边的人最近都在失业&#xff1f;无论是国企的、事业编的、又或者是民营企业的都在欠薪或者失业&#xff0c;看来经济寒潮是真的来了。虽然经济大环境不好&#xff0c;但是仍然涌现出了物联网、人工智能、大数据等新兴的蓝海市场。可是很多创投圈的朋友都表示&…

Spring-Boot常见的应用属性配置集

深入之前先用好&#xff0c;用好之前先全面了解功能。 全面了解功能可以从官方文档的配置参数选项作为切入点。 Appendix A. Common application properties - Spring # # COMMON SPRING BOOT PROPERTIES # 常见的Spring Boot属性集 # # This sample file is provided as a g…

CPU 算力分配(C语言)

题目来自于博主算法大师的专栏&#xff1a;最新华为OD机试C卷AB卷OJ&#xff08;CJavaJSPy&#xff09; https://blog.csdn.net/banxia_frontend/category_12225173.html 题目描述 现有两组服务器A和B&#xff0c;每组有多个算力不同的CPU&#xff0c;其中 A[i] 是 A 组第 i …

【机器学习学习脉络】

机器学习学习脉络 基础知识 数学基础 线性代数概率论与数理统计微积分最优化理论 编程基础 Python编程语言数据结构与算法软件工程原则 计算机科学基础 操作系统网络通信数据库系统 机器学习概论 定义与发展历程机器学习的主要任务和应用领域基本术语和概念 监督学习 线…

15:00面试,15:06就出来了,问的问题过于变态了。。。

我从一家小公司转投到另一家公司&#xff0c;期待着新的工作环境和机会。然而&#xff0c;新公司的加班文化让我有些始料未及。虽然薪资相对较高&#xff0c;但长时间的工作和缺乏休息使我身心俱疲。 就在我逐渐适应这种高强度的工作节奏时&#xff0c;公司突然宣布了一则令人…

蓝桥杯-最小砝码

知识点&#xff1a;本题主要考察任何一个物体都可以用 3进制表示。 #include <iostream> #include<cmath> using namespace std; //知识点:任何一个物体都可以用 3进制表示 int main() { int n; cin >> n; int sum 0; for (int i 0;; i)…

多表联合分页查询(一)----数据库与返回实体类准备

目录 一、数据库表准备1.文章表2.用户表3.用户详细信息表4.用户点赞表5.用户评论表 二、需求描述三、返回实体类 一、数据库表准备 1.文章表 CREATE TABLE yan_article (id bigint(20) NOT NULL,summary varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NU…

vue2实现无感刷新token

&#x1f3ac; 江城开朗的豌豆&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 &#x1f4dd; 个人网站 :《 江城开朗的豌豆&#x1fadb; 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 &#x1f4d8; 引言&#xff1a; &#x1f4…

【Vue3】学习watch监视:深入了解Vue3响应式系统的核心功能(上)

&#x1f497;&#x1f497;&#x1f497;欢迎来到我的博客&#xff0c;你将找到有关如何使用技术解决问题的文章&#xff0c;也会找到某个技术的学习路线。无论你是何种职业&#xff0c;我都希望我的博客对你有所帮助。最后不要忘记订阅我的博客以获取最新文章&#xff0c;也欢…

携程token算法分析

声明 本文以教学为基准、本文提供的可操作性不得用于任何商业用途和违法违规场景。 本人对任何原因在使用本人中提供的代码和策略时可能对用户自己或他人造成的任何形式的损失和伤害不承担责任。 如有侵权,请联系我进行删除。 这里只是我分析的分析过程,以及一些重要点的记录…

[云原生] k8s中kubectl陈述式资源管理

一、管理k8s核心资源的两种基本方法 陈述式资源管理方法 --主要依赖命令行工具kubectl进行管理 优点 可以满足90%以上的使用场景 对资源的增、删、查操作比较容易 缺点 命令冗长&#xff0c;复杂&#xff0c;难以记忆 特定场景下&#xff0c;无法实现管理需求 对资源的修改…

每日汇评:英镑可能走高,而1.2650支撑位保持不变

英镑/美元上周收于正值区域&#xff1b; 1.2650是该货币对的关键近期支撑位&#xff1b; 如果市场情绪恶化&#xff0c;该货币对的上涨空间可能仍然有限&#xff1b; 英镑/美元利用围绕美元的广泛抛售压力&#xff0c;自 1 月初以来首次录得周涨幅。 周一早盘该货币对稳定在 1.…

TF-A之供应链威胁模型分析

目录 一、简介 二、TF-A 概述 2.1、TF-A 存储库 2.2、外部依赖 2.3、附加二进制文件 2.4、TF-A工具链 2.5、基础设施 三、TF-A

Premiere企业发展历程公司历史回顾视频制作pr时间线模板

企业发展历程公司历史回顾视频制作PR时间线模板mogrt。 项目特点&#xff1a;色彩控件&#xff0c;适用于任何字体&#xff0c;包含视频帮助&#xff0c;适用于Premiere Pro 2021及以上版本。 更多PR资源下载&#xff1a;https://prmuban.com/37916.html

java环境搭建

1.jdk下载安装 下载 https://www.oracle.com/java/technologies/downloads/ jdk21 安装完成 java.exe是执行程序 javac.exe是编译工具 配置JAVA_HOME 环境变量 java环境变量设为变量JAVA_HOME 加上bin,以后只用更改JAVA_HOME地址即可 2.idea安装 下载 https://www.jet…

UDP套接字使用connect函数

在Linux环境下&#xff0c;UDP套接字可以使用connect函数。虽然UDP是无连接的协议&#xff0c;但是使用connect函数可以为UDP套接字设置一个默认的目标地址。 这样做有几个好处&#xff1a; 减少发送数据时的参数&#xff1a;当你使用connect函数为UDP套接字设置了一个目标地址…

Python 开发转 Java 简易路线 - 完结

有了 Python 开发基础&#xff0c;Java 的内容都可以快速过一遍&#xff0c;复杂地方跟着写一遍。 个人博客&#xff08;可参考&#xff09;&#xff1a;https://itnxd.eu.org/ 一、基础 1、Java 基础&#xff1a;尚硅谷 - Java基础 全部快速过一遍&#xff0c; 2、数据库&a…

动态规划(算法竞赛、蓝桥杯)--最详细的01背包DP问题滚动数组优化

1、B站视频链接&#xff1a;E08【模板】背包DP 01背包_哔哩哔哩_bilibili 题目链接&#xff1a;[USACO07DEC] Charm Bracelet S - 洛谷 #include <bits/stdc.h> using namespace std; const int N3410,M13000; int n,m; int d[N],w[N],f[N][M];//价值、体积、状态数组 …

Linux 软链接与硬链接

目录 创建软链接 创建硬链接 删除软链接 软链与硬链区别 创建软链接 软链接是一个指向另一个文件或目录的引用&#xff0c;类似于Windows系统中的快捷方式。 ln -s [目标文件路径] [链接文件名] 例如&#xff0c;要在当前目录下创建一个名为link_file的软链接&#xff0c…