b_lc_完成任务的最少工作时间段(贪心(×) / 枚举)
时间:2021-08-29
本文章向大家介绍b_lc_完成任务的最少工作时间段(贪心(×) / 枚举),主要包括b_lc_完成任务的最少工作时间段(贪心(×) / 枚举)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
第 i 个任务需要花费 tasks[i] 小时完成。一个 工作时间段 中,你可以 至多 连续工作 sessionTime 个小时,然后休息一会儿。
你需要按照如下条件完成给定任务:
- 如果你在某一个时间段开始一个任务,你需要在 同一个 时间段完成它。
- 完成一个任务后,你可以 立马 开始一个新的任务。
- 你可以按 任意顺序 完成任务。
给你 tasks 和 sessionTime ,请你按照上述要求,返回完成所有任务所需要的 最少 数目的 工作时间段 。
思路:一开始一维可以用贪心做,但是发现有特殊样例没过掉,
class Solution {
public:
int minSessions(vector<int>& A, int sessionTime) {
int n = A.size();
multiset<int> st;
for (int i = 0; i < n; ++i) {
st.insert(sessionTime);
}
sort(A.begin(), A.end());
int ans = 0;
for (int i = n - 1; i >= 0; --i) {
int a = A[i];
auto it = st.lower_bound(a);
if (*it == sessionTime) {
ans++;
}
int r = *it - a;
st.erase(it);
if (r != 0) {
st.insert(r);
}
}
return ans;
}
};
递归枚举状态:对于每个任务来说,要么新开一个 session 去做、要么在已经开了的 session 去执行,为了实现存储,需要容器去存储以前开启了的 session:
class Solution {
public:
int ans = INT_MAX;
void dfs(int i, int sessionTime, vector<int> curSessions, vector<int>& A) {
if (curSessions.size() >= ans) {
return;
}
if (i >= A.size()) {
ans = min(ans, (int) curSessions.size());
return;
}
//在原有的session上做任务
for (int j = 0; j < curSessions.size(); ++j) {
if (A[i] + curSessions[j] <= sessionTime) {
curSessions[j] += A[i];
dfs(i + 1, sessionTime, curSessions, A);
curSessions[j] -= A[i];
}
}
//新开session
curSessions.push_back(A[i]);
dfs(i + 1, sessionTime, curSessions, A);
curSessions.pop_back();
}
int minSessions(vector<int>& A, int sessionTime) {
vector<int> curSessions;
dfs(0, sessionTime, curSessions, A);
return ans;
}
};
原文地址:https://www.cnblogs.com/wdt1/p/15202287.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Go之context包的分析
- Repulsion Loss 遮挡场景下的目标检测
- Selenium4 IDE新特性:弹性测试、循环和逻辑判断
- Go 字符串处理
- Golang 特殊类型
- IntelliJ中基于文本的HTTP客户端
- Pytorch转Msnhnet模型思路分享
- Go socket实现多语言间通信
- Golang不同类型比较
- 牛逼!Intellij IDEA竟然有个功能可自动生成代码,你用过没?
- 导出mysql表结构生成grpc需要的proto文件工具
- 尤大 3 天前发在 GitHub 上的 vue-lit 是啥?
- 微信小程序客服消息功能 php
- CVPR 2020 在频域中学习的DCTNet
- 微信小程序发送模板消息