【力扣每日一题】2023.9.11 课程表Ⅲ

目录

题目:

示例:

分析:

代码:


题目:

示例:

分析:

今天是和前两天一样课程表,不过今天不太一样了,今天不是图论了,可以看作是全新的题目。

给我们一个课程数组,里面的元素是每个课程的学习所需花费时间和结课时间,我们需要在结课时间到达之前学习完课程。问我们最终可以学完多少门课程。

我们需要尽可能多得学习课程,那么必然是需要贪心的,问题在于我们需要怎么贪。我们应该先学习花费时间短的课程以及优先学习快结课的课程。

也就是在优先学习快结课的课程的基础上选择花费时间短的课程,结课时间的优先级较高,因此我们对课程数组按照结课时间来进行排序。

做完预处理之后,我们定义一个变量,表示目前所在的时间,初始化为0,表示我们在开学的第一天,每次学习完某门课程之后,我们就把这个时间加上学习花费的时间。

接着我们开始模拟学习课程,按照顺序遍历排完序的课程数组,如果当前的课程的花费时间加上我们所在的时间仍未超过当前课程的结课时间,那么我们学习这门课程,更新一下所在的时间点。

如果当前课程花费的时间加上我们所在的时间之后超过了结课时间,那么我们无法学习这门课程,不过我们可以贪心一下,如果这门课程花费的时间比我们学过的课程中花费最多的时间更少,那么我们可以选择不学那门花费更多的课程转为学习本门课程,因为我们是按照结课时间来排序,并且是按顺序遍历的,所以替换是不会发生冲突的。

为了更方便地获取我们学习过的课程的最大花费,我们可以拿一个大顶堆来存放已经学习过的课程的花费时间,每次学习了课程,我们就把花费时间放进去,每次替换了学习的课程,我们就将大顶堆的堆顶元素推出,再把新课程塞进去。

替换之后我们还需要更新一下时间点,因为学习课程花费的时间总量少了,因此我们需要补个"差价",把时间点再减去替换课程的花费时间之差。

最后遍历完毕,我们返回大顶堆的大小即可。

代码:

cpp 复制代码
class Solution {
public:
    int scheduleCourse(vector<vector<int>>& courses) {
        //按照截止日期来排序,优先学习临期课程
        sort(courses.begin(),courses.end(),[](auto &a,auto &b){return a[1]<b[1];});
        //大顶堆存放已经学习课程所花费的时间
        priority_queue<int> pq;     
        int start=0; 
        for (auto& c:courses) {
            //学习课程之后不超过规定的时间,那么可以学习,大顶堆中加入
            if(start+c[0]<=c[1]){ 
                pq.push(c[0]);
                start+=c[0];
            }
            //如果学习课程的时间小于已经学习的课程中时间最大的课程,那么可以替代掉
            else if(!pq.empty()&&pq.top()>c[0]){
                start-=pq.top()-c[0];   //时间上补个差价
                pq.pop();               //把大顶堆中的最大元素换出来
                pq.push(c[0]);          
            }
        }
        return pq.size();
    }
};
相关推荐
c23856几秒前
MySQL 基础用法(上):库表管理与数据增删改
c语言·数据库·c++·mysql
Sagittarius_A*30 分钟前
后量子密码|通识认知 03|量子威胁辟谣:Grover 算法对对称密码的影响与误区
算法·信息安全·密码学·量子计算·pqc·后量子密码
光源【时光寸寸又逢君】41 分钟前
第三方平台预览我方级联监控点串流问题排查
c++·iot
键盘会跳舞1 小时前
C++:容器适配器 queue 的源码级拆解
开发语言·c++·queue
YuforiaCode2 小时前
第十六届蓝桥杯 2025 C/C++组 数列差分
c语言·c++·蓝桥杯
QAQo7T2 小时前
Python组蓝桥杯备赛超详细知识点总结笔记_排序算法篇
笔记·python·算法·蓝桥杯·排序算法
千里之行,始于足下sanhai2 小时前
P8686 [蓝桥杯 2019 省 A] 修改数组 - 数字魔法大冒险 题解
c++·算法·动态规划
小星星闪亮登场2 小时前
Codeforces Round 1115 ( Div. 2)
数据结构·c++·算法·贪心算法·排序算法·codeforces
计算机小白一个2 小时前
蓝桥杯 Java B 组之哈希表应用(两数之和、重复元素判断)
java·数据结构·算法·蓝桥杯
Loge编程生活2 小时前
打卡信奥刷题(3449)用C++实现信奥题 P10429 [蓝桥杯 2024 省 B] 拔河
开发语言·数据结构·c++·算法·青少年编程