来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/course-schedule-iii

题目描述

这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] = [durationi, lastDayi] 表示第 i 门课将会 持续 上 durationi 天课,并且必须在不晚于 lastDayi 的时候完成。

你的学期从第 1 天开始。且不能同时修读两门及两门以上的课程。

返回你最多可以修读的课程数目。

示例 1:

输入:courses = [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]
输出:3
解释:
这里一共有 4 门课程,但是你最多可以修 3 门:
首先,修第 1 门课,耗费 100 天,在第 100 天完成,在第 101 天开始下门课。
第二,修第 3 门课,耗费 1000 天,在第 1100 天完成,在第 1101 天开始下门课程。
第三,修第 2 门课,耗时 200 天,在第 1300 天完成。
第 4 门课现在不能修,因为将会在第 3300 天完成它,这已经超出了关闭日期。
示例 2:

输入:courses = [[1,2]]
输出:1
示例 3:

输入:courses = [[3,2],[4,3]]
输出:0

提示:

1 <= courses.length <= 104
1 <= durationi, lastDayi <= 104

解题思路

使用贪心的思路,尽早学习结束时间较早的科目。首先根据截止时间来将课程排序。

然后依次尝试学习课程,判断总时间是否满足截止日期,如果满足截止日期,那么学习这门课,如果不满足,就是查找之前的课程中是否有比这节课时间长的课程,替换时间最长的课程,替换后的课程数目不变,但是课程持续时间会变短,更有利于之后课程的学习。

源码展示

class Solution {
public:
int scheduleCourse(vector<vector<int>>& courses) {
sort(courses.begin(), courses.end(), [](const auto& c0, const auto& c1) {
return c0[1] < c1[1];
});
priority_queue<int> qiCounses;
int iSumT = 0;
for(auto c: courses)
{
if(iSumT + c[0] <= c[1])
{
qiCounses.push(c[0]);
iSumT += c[0];
}
else
{
if(!qiCounses.empty() && c[0] < qiCounses.top())
{
iSumT = iSumT + c[0] - qiCounses.top();
qiCounses.pop();
qiCounses.push(c[0]);
}
}
}
return qiCounses.size(); }
};

运行结果

最新文章

  1. Android实现透明式状态栏
  2. [delphi]向ImageList中加入png类型的资源图片
  3. 使用PowerShell向SharePoint中写入数据
  4. linux线程的实现【转】
  5. WCF初探-3:WCF消息交换模式之单向模式
  6. 【Python】logging模块学习笔记
  7. Azure + vsftpd + ubntu14 + 虚拟用户 遇到的问题:从网上摘抄
  8. bash shell for循环1到100 .
  9. jQuery $.each用法比较详细了
  10. Solaris 11的自动化安装(AI server)的搭建
  11. css 样式那些事
  12. spring mvc在Controller中获取ApplicationContext
  13. 《Django By Example》第九章 中文 翻译 (个人学习,渣翻)
  14. jfinal使用jstl表达的存在的问及解决
  15. 大数据技术之_19_Spark学习_03_Spark SQL 应用解析小结
  16. CentOS 7 minimal配置网络连接及net-tools安装
  17. Leaflet获取可视范围内4个顶点
  18. Dubbo-Admin 2.6.0使用
  19. 链接错误:multiple definition of &#39;xxx&#39; 问题解决及其原理
  20. Jquery回到顶部效果

热门文章

  1. openpyxl写数据
  2. @ApiImplicitParams注解的详细使用
  3. Codeforces Round #838 (Div. 2) D. GCD Queries
  4. 万字长文解析Scaled YOLOv4模型(YOLO变体模型)
  5. [编程基础] C#自定义类调用窗体控件
  6. [OpenCV实战]51 基于OpenCV实现图像极坐标变换与逆变换
  7. react 高效高质量搭建后台系统 系列 —— 请求数据
  8. [Unity]限制两个物体之间的距离
  9. Mac上优秀的虚拟机软件推荐 PD Parallels Desktop 18.1.1
  10. SICP:复数的直角和极坐标的表示(Python实现)