当前位置: 首页 > news >正文

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

一解析:

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

但是,对于第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为任务最大结束时间

相关文章:

  • Linux防火墙(以iptables为例)
  • 十种常用数据分析模型
  • 万界星空科技定制化MES系统帮助实现数字化生产
  • 自建公式,VBA在Excel中解一元一次方程
  • docker命令总结
  • upload-labs 21关解析
  • 手把手教你写Java项目(1)——流程
  • 什么是深拷贝和浅拷贝?
  • 微服务架构的优势 与 不足
  • 常见排序算法之选择排序
  • 内网安全-隧道搭建穿透上线内网穿透-nps自定义上线内网渗透-Linux上线-cs上线Linux主机
  • 微信生态系统介绍
  • Android 待办类应用提醒功能的实现及其问题
  • ⌈ 传知代码 ⌋ 高速公路车辆速度检测软件
  • 全同态加密生态项目盘点:FHE技术的崛起以及应用
  • [iOS]Core Data浅析一 -- 启用Core Data
  • 230. Kth Smallest Element in a BST
  • Android Studio:GIT提交项目到远程仓库
  • github从入门到放弃(1)
  • HomeBrew常规使用教程
  • JSDuck 与 AngularJS 融合技巧
  • Laravel核心解读--Facades
  • pdf文件如何在线转换为jpg图片
  • Redis 中的布隆过滤器
  • 分布式任务队列Celery
  • 关键词挖掘技术哪家强(一)基于node.js技术开发一个关键字查询工具
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 今年的LC3大会没了?
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 如何实现 font-size 的响应式
  • 网络应用优化——时延与带宽
  • 赢得Docker挑战最佳实践
  • ​软考-高级-系统架构设计师教程(清华第2版)【第20章 系统架构设计师论文写作要点(P717~728)-思维导图】​
  • ### Error querying database. Cause: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException
  • #1015 : KMP算法
  • #etcd#安装时出错
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (52)只出现一次的数字III
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (四)图像的%2线性拉伸
  • (转)大道至简,职场上做人做事做管理
  • (转)利用PHP的debug_backtrace函数,实现PHP文件权限管理、动态加载 【反射】...
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET C# 使用GDAL读取FileGDB要素类
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core 通过 Ef Core 操作 Mysql
  • .net dataexcel 脚本公式 函数源码
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET开源的一个小而快并且功能强大的 Windows 动态桌面软件 - DreamScene2
  • .NET框架设计—常被忽视的C#设计技巧
  • .sdf和.msp文件读取
  • /var/lib/dpkg/lock 锁定问题
  • @Autowired 与@Resource的区别