任务处理 - 华为OD统一考试(C卷)

OD统一考试(C卷)

分值: 200分

题解: Java / Python / C++

alt

题目描述

在某个项目中有多个任务(用tasks数组表示)需要您进行处理,其中tasks[i]=[si,ei],

你可以在si <= day <= ei 中的任意一天处理该任务,请返回你可以处理的最大任务数

输入描述

第一行为任务数量n,1 <=n<= 100000。

后面n行表示各个任务的开始时间和终止时间,使用si,ei表示,1 <= si <= ei <= 100000

输出描述

输出为一个整数,表示可以处理的最大任务数。

示例1

输入:
3
1 1
1 2
1 3输出:
3

题解

使用了贪心算法的思想。

主要思路是按照任务的开始时间进行排序,然后使用小根堆(优先队列)来保存当前可以执行的任务的截止时间。

遍历每一天,将当天可以执行的任务加入小根堆,同时弹出已经过期的任务,然后在小根堆中选择距离截止时间最近的任务进行处理。这样可以保证每一天都选择了最优的任务,从而得到最大的任务数。

在代码中,使用了一个**优先队列(小根堆)**来维护当前可以执行的任务的截止时间。具体步骤如下:

  1. 将任务数组按照开始时间从小到大排序。
  2. 使用一个小根堆(优先队列)pq,用于保存当前可以执行的任务的截止时间。
  3. 遍历每一天,将当天开始的任务加入小根堆,同时弹出已经过期的任务。
  4. 在小根堆中选择距离截止时间最近的任务进行处理,每次处理后将该任务从小根堆中弹出。
  5. 统计处理的任务数量即为最大任务数。

最后,输出最大任务数即为题目要求的结果。

时间复杂度分析:

假设任务数量为n,排序的时间复杂度为O(nlogn),遍历每一天的时间复杂度为O(100000),而在每一天内对小根堆进行插入和弹出的操作的时间复杂度为O(logn),所以总的时间复杂度为O(nlogn + 100000logn)。由于100000logn相对于nlogn的影响较小,可以近似看作O(nlogn)。

空间复杂度分析:

除了输入和输出所需的空间外,额外使用了一个小根堆来存储任务的截止时间,因此空间复杂度为O(n)。

Java

import java.util.Arrays;
import java.util.PriorityQueue;
import java.util.Scanner;/*** @author code5bug*/
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();int[][] tasks = new int[n][2];for (int i = 0; i < n; i++) {tasks[i][0] = in.nextInt();tasks[i][1] = in.nextInt();}Arrays.sort(tasks, (a, b) -> a[0] - b[0]);// 小根堆,保存当前可以执行的任务的截止时间PriorityQueue<Integer> pq = new PriorityQueue<>();int idx = 0, result = 0;for (int now = 1; now <= 100000 + 5; now++) {// 当前 tasks[idx] 任务可以在 now 天完成while (idx < n && tasks[idx][0] <= now) {pq.add(tasks[idx][1]);idx++;}// 当前时间已经超过了任务的结束时间,则任务不可能被执行则抛弃掉while (!pq.isEmpty() && pq.peek() < now) {pq.poll();}// 当前时间贪心的选择距离截止时间最近的任务if (!pq.isEmpty()) {result++;pq.poll();}}System.out.println(result);}
}

Python

from heapq import heappush
from heapq import heappopn = int(input())
tasks = [list(map(int, input().split())) for _ in range(n)]
tasks.sort()# 小根堆,保存当前可以执行的任务的截止时间
pq = []idx, result = 0, 0
for now in range(1, 100000 + 5):# 当前 tasks[idx] 任务可以在 now 天完成while idx < n and tasks[idx][0] <= now:heappush(pq, tasks[idx][1])idx += 1# 当前时间已经超过了任务的结束时间,则任务不可能被执行则抛弃掉while pq and pq[0] < now:heappop(pq)# 当前时间贪心的选择距离截止时间最近的任务if pq:result += 1heappop(pq)print(result)

C++

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>using namespace std;int main() {int n;cin >> n;// 保存任务的开始时间和截止时间的pairvector<pair<int, int>> tasks(n);// 输入任务信息并按截止时间排序for (int i = 0; i < n; ++i) {cin >> tasks[i].first >> tasks[i].second;}sort(tasks.begin(), tasks.end());// 小根堆,保存当前可以执行的任务的截止时间priority_queue<int, vector<int>, greater<int>> pq;int idx = 0, result = 0;for (int now = 1; now <= 100000 + 5; ++now) {// 当前 tasks[idx] 任务可以在 now 天完成while (idx < n && tasks[idx].first <= now) {pq.push(tasks[idx].second);idx++;}// 当前时间已经超过了任务的结束时间,则任务不可能被执行则抛弃掉while (!pq.empty() && pq.top() < now) {pq.pop();}// 当前时间贪心的选择距离截止时间最近的任务if (!pq.empty()) {result++;pq.pop();}}cout << result << endl;return 0;
}

‍❤️‍华为OD机试面试交流群每日真题分享): 加V时备注“华为od加群”

🙏整理题解不易, 如果有帮助到您,请给点个赞 ‍❤️‍ 和收藏 ⭐,让更多的人看到。🙏🙏🙏

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

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

相关文章

代码随想录day25--回溯的应用4

LeetCode491.非递减子序列 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0c;…

【目标跟踪】提供一种简单跟踪测距方法(c++)

文章目录 一、前言二、c代码2.1、Tracking2.2、KalmanTracking2.3、Hungarian2.4、TrackingInfo 三、调用示例四、结果 一、前言 在许多目标检测应用场景中&#xff0c;完完全全依赖目标检测对下游是很难做出有效判断&#xff0c;如漏检。检测后都会加入跟踪进行一些判断或者说…

中科星图——Landsat8_C2_ST数据集是经大气校正的地表温度数据

数据名称&#xff1a; Landsat8_C2_ST 数据来源&#xff1a; USGS 时空范围&#xff1a; 2020年1月-2023年3月 空间范围&#xff1a; 全国 数据简介&#xff1a; Landsat8_C2_ST数据集是经大气校正的地表温度数据&#xff0c;属于Collection2的二级数据产品&#xff0…

nginx 日志改为json格式

nginx 日志改为json格式 场景描述 正常使用nginx时&#xff0c;使用默认的日志输出格式&#xff0c;对于后续日志接入其他第三方日志收集、清洗环节&#xff0c;因分隔符问题可能不是很友好。 xxxx - - [19/Feb/2024:11:16:48 0800] "GET /time_feed HTTP/1.1" 20…

虚拟和现实的界限不存在了吗

Sora是美国人工智能公司OpenAI最新发布的“文生视频”大模型。与之前的模型相比&#xff0c;Sora能够一次性生成长达一分钟的高清视频&#xff0c;这是目前业内主流的数秒钟版本所无法比拟的。Sora的发布在市场上引起了极大的关注&#xff0c;并被认为是人工智能领域的一次重大…

【Java EE初阶十三】网络初识

1. 网络发展史 网络发展的几个主要时期&#xff1a; 单机时代->局域网时代->广域网时代->移动互联网时代 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同工作来完成 业务&#xff0c;就有了网络互…

行人重识别

&#xfeff;在人的感知系统所获得的信息中&#xff0c;视觉信息大约占到80%&#xff5e;85%。行人重识别&#xff08;person re-identification&#xff09;是近几年智能视频分析领域兴起的一项新技术&#xff0c;属于在复杂视频环境下的图像处理和分析范畴&#xff0c;是许多…

300分钟吃透分布式缓存-02讲:如何根据业务来选择缓存模式和组件?

缓存读写模式 如下图&#xff0c;业务系统读写缓存有 3 种模式&#xff1a; & Cache Aside&#xff08;旁路缓存&#xff09; & Read/Write Through&#xff08;读写穿透&#xff09; & Write Behind Caching&#xff08;异步缓存写入&#xff09; Cache Asid…

redis 值中文显示乱码

问题&#xff1a; 解决办法&#xff1a; exit退出 进入时添加 --raw参数

【软件设计师】程序猿需掌握的技能——数据流图

作为一个程序员&#xff0c;不仅要具备高水平的程序编码能力&#xff0c;还要是熟练掌握软件设计的方法和技术&#xff0c;具有一定的软件设计能力&#xff0c;一般包括软件分析设计图&#xff08;常见的有数据流图&#xff0c;程序流程图&#xff0c;系统流程图&#xff0c;E-…

每日一练:LeeCode-501、二叉搜索树中的众数【二叉搜索树+pre辅助节点+DFS】

本文是力扣LeeCode-LeeCode-501、二叉搜索树中的众数【二叉搜索树pre辅助节点DFS】 学习与理解过程&#xff0c;本文仅做学习之用&#xff0c;对本题感兴趣的小伙伴可以出门左拐LeeCode。 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;…

个性签名大全

只许一生浮世清欢愿我以孤独作为铠甲&#xff0c;自此不再受伤愿我是阳光&#xff0c;明媚而不忧伤我不敢太勇敢太执着太骄傲&#xff0c;我怕失去开始你是我的天使&#xff0c;最后你是我的唯一姐的霸气&#xff0c;无人能比&#xff0c;哥的傲气&#xff0c;无人能朋唯有万事…

ASUS华硕枪神8笔记本电脑G614JIR,G814JVR,G634JYR,G834JZR工厂模式出厂Windows11系统 带重置还原功能

适用ROG枪神8系列笔记本型号&#xff1a; G614JIR、G614JVR、G634JYR、G634JZR G814JIR、G814JVR、G834JYR、G834JZR 链接&#xff1a;https://pan.baidu.com/s/1tYZt6XFNC2d6YmwTbtFN7A?pwd3kp8 提取码&#xff1a;3kp8 带有ASUS RECOVERY恢复功能、自带所有驱动、出厂主…

PyCharm - Run Debug 程序安全执行步骤

PyCharm - Run & Debug 程序安全执行步骤 1. Run2. DebugReferences 1. Run right click -> Run ‘simulation_data_gene…’ or Ctrl Shift F10 2. Debug right click -> Debug ‘simulation_data_gene…’ 在一个 PyCharm 工程下&#xff0c;存在多个 Pytho…

3个密码学相关的问题

一、离散对数问题&#xff08;Discrete Logarithm Problem, DLP&#xff09; 问题描述&#xff1a;给定 有限阿贝尓群 G中的2个元素a和b&#xff0c;找出最小的正整数x满足&#xff1a;b a ^^ x &#xff08;或者证明这样的x不存在&#xff09;。 二、阶数问题&#xff08;O…

【PyQt】13-对话框

文章目录 前言一、知识储备二、详细展开2.1 通用对话框-QDialog2.1 消息类型对话框-QMessageBox运行结果 2.2 输入对话框 QInputDilog运行结果 2.3 字体对话框-QFontDialog运行结果 2.4 颜色对话框运行结果 2.5 文件对话框运行结果 总结 前言 1、四种形式的对话框。 2、警告框…

深入理解 Vue3 中的 setup 函数

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

搞不明白这4类车,别去自驾游

文 | AUTO芯球 作者 | 太2 春天要来了 又可以去浪了 喜欢自驾的朋友憋不住了吧&#xff0c; 鄙人不才全国各地走过&#xff0c;各种车型也大致开过。 那么根据我这几年的自驾经历 来跟大家聊一聊我觉得比较方便好用的自驾车。 第一类&#xff0c;城市SUV 宝马X&#xff…

vue框架-vue-cli

vue-cli Vue CLI是一个官方的脚手架工具,用于快速搭建基于Vue.js的项目。Vue CLI提供了一整套可配置的脚手架,可以帮助开发人员快速构建现代化的Web应用程序。 Vue CLI通过提供预先配置好的Webpack模板和插件,使得开发人员可以在不需要手动编写Webpack配置的情况下快速创建…

【Docker】docker安装

需要云服务器等云产品来学习Linux可以移步/-->腾讯云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、Ubuntu安装docker 1、查看操作系统和CPU架构 2、卸载docker 3、配置docker下载源 4、安装docker 5、解决报错…