算法-可完成的最大任务数

一解析:

为了尽可能多的完成任务,充分利用时间,越早越好,所以从项目开启的那一天起就开始做任务,一直做到项目结束为止。

但是,对于第i天来说,若可执行的任务有多个,该如何选择?根据设定,这些任务都有各自的结束时间,所以为了尽可能多的做任务,优先选择结束时间早的任务;若第i天没有任务,就选择等待(休息)。

根据思路,可写出暴力搜索的代码(超时)

import java.util.*;
public class Main{public static void main(String[] args){Scanner in=new Scanner(System.in);int n=in.nextInt();int[][] task=new int[n][2];int minTime=Integer.MAX_VALUE,maxTime=Integer.MIN_VALUE;for(int i=0;i<n;i++){task[i][0]=in.nextInt();task[i][1]=in.nextInt();minTime=Math.min(minTime,task[i][0]);maxTime=Math.max(maxTime,task[i][1]);}int ans=0;// 避免重复执行int[] used=new int[n];while(minTime<=maxTime){int minEnd=Integer.MAX_VALUE,index=-1;for(int i=0;i<n;i++){int[] arr=task[i];//可执行的任务中选择结束时间最早的if(used[i]==0&&arr[0]<=minTime&&minTime<=arr[1]){if(arr[1]<minEnd){minEnd=arr[1];index=i;}}}if(index!=-1){used[index]=1;ans++;}minTime++;}System.out.println(ans);}
}

二、优化:

根据暴力枚举,不难得出正确答案。但是时间复杂度为O(n2),显然会超时。

1:任务数组排序

第i天可执行的任务,其开始时间都小于等于i,若把任务数组按照开始时间进行升序排序,则在寻找可执行任务时,可避免全表扫描(任务的开始时间超过i时,停止搜索)。

2:扫描结果复用

对于第i天可执行的任务,可收集起来,供第i+1天复用,避免再重复扫描判断这些任务。为方便起见,用队列收集第i天可执行的任务,为筛选最早结束的任务,队列存储任务的结束时间,按小顶堆排序。

细节:对于第i天收集的到可执行任务队列,由于队列是复用的,所以可能包含第i天之前收集的任务,这些任务可能过期(根据任务结束时间<i判断),需要清理。

3:代码

import java.util.*;
public class Main{public static void main(String[] args){Scanner in=new Scanner(System.in);int n=in.nextInt();int[][] task=new int[n][2];int minTime=Integer.MAX_VALUE,maxTime=Integer.MIN_VALUE;for(int i=0;i<n;i++){task[i][0]=in.nextInt();task[i][1]=in.nextInt();maxTime=Math.max(maxTime,task[i][1]);minTime=Math.min(minTime,task[i][0]);}Arrays.sort(task,(a,b)->a[0]-b[0]);int ans=0,i=0;PriorityQueue<Integer> queue=new PriorityQueue<>((a,b)->a-b);while(minTime<=maxTime){while(i<n&&task[i][0]<=minTime){queue.add(task[i][1]);i++; }//queue是可复用的,所以queue中的有些任务是之前添加的,可能过期,需要清理while(!queue.isEmpty()&&queue.peek()<minTime){queue.poll();}// 堆顶即被选中的任务if(!queue.isEmpty()){queue.poll();ans++;}minTime++;}System.out.println(ans);}
}

优化后,最多访问一遍任务数组,所以时间复杂度变成O(max{n,m}),n为任务数,m为任务最大结束时间

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

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

相关文章

C语⾔:内存函数

1. memcpy使⽤和模拟实现&#xff08;对内存块的复制&#xff0c;不在乎类型&#xff09; void * memcpy ( void * destination, const void * source, size_t num ); • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 • 这个函数在遇…

3D Slicer:从入门到精通——数据模块之DICOM

DICOM 文章目录 DICOM概述DICOM简介Slicer DICOM数据库DICOM插件 如何操作创建DICOM数据库将DICOM文件读入场景DICOM导入DICOM加载 从DICOM数据库中删除数据将数据从场景导出到DICOM数据库将数据从场景导出到DICOM文件DICOM网络传输DICOMweb网络传输 查看DICOM元数据 面板及其用…

指定目录匹配文件并批量导入

需求描述: 1,需要从某个目录以某种正则表达式匹配到所有文件 2,将这些文件批量上传 3,上传完成后需要返回上传的地址 1,引入依赖 <!-- 测试 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…

R实验 参数估计

实验目的&#xff1a; 掌握矩法估计与极大似然估计的求法&#xff1b;了解估计量的优良性准则&#xff1a;无偏性、有效性、相合性&#xff08;一致性&#xff09;&#xff1b;学会利用R软件完成一个正态总体均值和两个正态总体均值差的区间估计&#xff1b;学会利用R软件完成…

NiuCloud-Admin-SAAS:引领前端技术革新与SaaS应用快速开发的未来

一、引言 在数字化快速发展的今天&#xff0c;企业对于快速搭建、高效运营的SaaS&#xff08;Software-as-a-Service&#xff09;系统的需求日益增长。为满足这一需求&#xff0c;NiuCloud-Admin-SAAS作为一款快速开发SaaS通用管理系统后台框架&#xff0c;凭借其先进的技术栈…

基于Java实现震中附近风景区预警可视化分析实践

目录 前言 一、空间数据说明 1、表结构信息展示 2、空间范围查询 二、Java后台开发实现 1、模型层设计与实现 2、控制层设计与实现 三、Leaflet地图开发 1、地震震中位置展示 2、百公里风景区列表展示 3、风景区列表展示 4、附近风景区展示 四、总结 前言 地震这类…

【区块链】webase-front

因为WeBASE是基于Java开发的&#xff0c;故依赖于Java运行环境&#xff0c;支持版本JDK 8至JDK 14。 我们安装JDK 8。在Linux终端中&#xff0c;使用如下命令安装开源版本JDK 8 apt update apt install -y openjdk-8-jdk 安装JDK8后&#xff0c;需要设置JAVA_HOME环境变量&am…

链表mark

什么是链表&#xff0c;链表是一种通过指针串联在一起的线性结构&#xff0c;每一个节点由两部分组成&#xff0c;一个是数据域一个是指针域&#xff08;存放指向下一个节点的指针&#xff09;&#xff0c;最后一个节点的指针域指向null&#xff08;空指针的意思&#xff09;。…

[数智人文实战] 02.舆情分析之词云可视化、文本聚类和LDA主题模型文本挖掘

【数智人文与文本挖掘】知识星球建立且正式运营,欢迎新老博友和朋友加入,一起分享更多数智人文知识和交流进步。该星球计划每周至少分享7个资源或文章,包括数智人文、文本挖掘、人工智能、大数据分析和图书情报的技术文章、代码及资源。同时,欢迎进入星球的朋友咨询我图情和…

Java开发错误经验积累

业务平时积累 为什么用StringUtils来判断字符串是否为空 在 Java 中,当一个字符串为 null 时,调用它的方法会出现空指针异常。例如: String str = null; if (str.isEmpty()) {// ... }在上面的示例中,由于 str 为 null,调用它的 isEmpty() 方法会出现空指针异常。 为了…

操作系统课程实验1-进程调度模拟实验

操作系统课程实验1-进程调度模拟实验 一、实验介绍 1.1 实验目的 本实验模拟在单处理机环境下的处理机调度&#xff0c;帮助理解进程调度的概念&#xff0c;深入了解进程控制块的功能&#xff0c;以及进程的创建、撤销和进程各个状态间的转换过程。 1.2 实验内容 进程调度算…

NDIS小端口驱动开发(一)

在四种NDIS相关的驱动中&#xff0c;微型端口驱动(也经常翻译为为小端口驱动)位于驱动栈的底部&#xff0c;一般将它理解为NIC设备的驱动程序&#xff1a; 有几种类型的微型端口驱动程序类型&#xff1a; 无连接微型端口驱动程序用于控制无连接网络媒体 &#xff0c;如以太网的…

【量算分析工具-方位角】GeoServer改造Springboot番外系列六

【量算分析工具-概述】GeoServer改造Springboot番外系列三-CSDN博客 【量算分析工具-水平距离】GeoServer改造Springboot番外系列四-CSDN博客 【量算分析工具-水平面积】GeoServer改造Springboot番外系列五-CSDN博客 【量算分析工具-方位角】GeoServer改造Springboot番外系列…

题解:CF1968F(Equal XOR Segments)

题解&#xff1a;CF1968F&#xff08;Equal XOR Segments&#xff09; 题目翻译&#xff1a;定义一个序列是好&#xff0c;当且仅当可以将其分成大于 1 1 1 份&#xff0c;使得每个部分的异或和相等。现在给定一个长度为 n n n 的序列 a a a&#xff0c;以及 q q q 次查询…

redis基本数据结构与应用

文章目录 概要String结构Hash结构List结构Set结构Zset结构bitmap位图类型geo地理位置类型其他常用命令 概要 redis常用的5种不同数据结构类型之间的映射如下&#xff1a; 结构类型结构存储的值结构的读写能力STRING可以是字符串、整数或者浮点数key-value形式&#xff1b;对整…

JMH304-剑侠情缘2网络版+2017纹饰端+翅膀+单机+外网整理+各种副本

资源介绍&#xff1a; 藏剑-太虚-梁山-杀手堂种树地宫师门纹饰装备长流云阳套等等———– 做登录器联系站长 资源截图&#xff1a; 下载地址

面向切面编程AOP

学Java比搞科研快乐多了 AOP(Aspect rient Programming)&#xff0c;面向切面编程&#xff0c;AOP可以拦截指定的方法并且对方法增强&#xff0c;而且无需侵入到业务代码中&#xff0c;使业务与非业务处理逻辑分离&#xff0c;实现开闭原则。 主要术语&#xff1a; 连接点&…

.NET周刊【5月第4期 2024-05-26】

国内文章 开源低代码框架 ReZero API 正式版本发布 &#xff0c;界面操作直接生成API https://www.cnblogs.com/sunkaixuan/p/18201175 ReZero是一款.NET6的中间件&#xff0c;采用MIT许可证开源&#xff0c;目的是降低.NET Core开发的门槛。它提供界面操作生成API的功能&am…

【杂记-OSPF协议中浅析不同类型报文】

1、发送报文的频率&#xff1a;运行OSPF的路由器在低速网络中每40秒发送一次Hello报文&#xff0c;高速网络中每10秒发送一次Hello报文&#xff0c;由于现在的网络几乎都是以太网&#xff0c;所以每10秒发送一次。 2、部分报文的作用&#xff1a;发现并建立邻居关系、选举DR/BD…

《Ai学习笔记》自然语言处理 (Natural Language Processing):常见机器阅读理解模型(上)02

Glove 词向量&#xff1a; 在机器理解中的词的表示&#xff1a; 词袋&#xff08;bow,bag of words&#xff09; one-hot 词向量 word2vec glove 目的&#xff1a;将一个词转换成一个向量 Word2vec 是一种用于生成词向量的工具包&#xff0c;由Google在2013年开源推出…