news 2026/7/28 21:19:21

C++作业调度问题

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++作业调度问题

洛谷:作业调度方案

🚩 作业调度问题:算法笔记

1. 核心模拟策略:见缝插针

这类题目最容易掉入“按时间一分钟一分钟模拟”的陷阱(你第一版代码的问题)。

  • 正确思路:按照题目给出的优先顺序,依次为每个任务寻找最早可用的连续时间区间

  • 搜索起点:任务 i 的第 j 道工序,其搜索起点 T_start 必须满足:

    T_start >= 该工件前一道工序的结束时间 + 1

2. 关键数据结构

  • 机器时间轴(布尔阵):使用timeline[machine_id][time]记录机器在某一时刻是否被占用。

    • 注意:时间轴长度通常开到 10000 以上以防溢出。

  • 工件状态跟踪

    • last_time[job_id]:记录该工件上一次工序何时结束。

    • step[job_id]:记录该工件目前该做第几个工序。

3. 空档搜索逻辑(核心代码片段)

不要试图用复杂的动态规划,直接模拟“插入”最稳健:

从 start_from 开始向后遍历,直到连续 cost 个时间点对应的机器都处于空闲

for (int t = start_from + 1;; ++t) { bool check = true; for (int delta = 0; delta < cost; ++delta) { if (machine_timeline[machine][t + delta]) { check = false; break; } } if (check) { step[ind_idx]++; last_time[ind_idx] = t + cost - 1; fill_machine_time(t, cost, machine); break; } }

4. 完整代码

// 状态数组 vector<vector<bool>>machine_timeline(25, vector<bool>(10000, false)); vector<int>step(25, 1); vector<int>last_time(25, 0); // 常量数组 vector<int>order; vector<vector<int>>use_machine(25, vector<int>(25)); vector<vector<int>>use_time(25, vector<int>(25)); // 填充时间轴函数 void fill_machine_time(int start, int cost, int idx) { for (int i = start; i < start + cost; ++i)machine_timeline[idx][i] = true; } int main() { // 输入处理 int m, n; cin >> m >> n; for (int i = 1; i <= n * m; ++i) { int x; cin >> x; order.push_back(x); } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { cin >> use_machine[i][j]; } } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= m; ++j) { cin >> use_time[i][j]; } } int idx = 0; while (idx < (int)order.size()) { int ind_idx = order[idx]; int pro_idx = step[ind_idx]; int cost = use_time[ind_idx][pro_idx]; int start_from = last_time[ind_idx]; int machine = use_machine[ind_idx][pro_idx]; // 插缝 for (int t = start_from + 1;; ++t) { bool check = true; for (int delta = 0; delta < cost; ++delta) { if (machine_timeline[machine][t + delta]) { check = false; break; } } if (check) { step[ind_idx]++; last_time[ind_idx] = t + cost - 1; fill_machine_time(t, cost, machine); break; } } idx++; } // last_time中最大者即为最终时间 int res = 0; for (int i = 1; i <= n; ++i)res = max(res, last_time[i]); cout << res << endl; return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/28 11:19:21

开机Database connections will be migrated 弹窗

开机弹窗问题 你遇到的 Database connections will be migrated 弹窗&#xff0c;来自 MySQL Notifier 这个工具。它想把自己的连接信息迁移到 MySQL Workbench 里。解决方法&#xff1a;直接点击弹窗里的 Yes 就可以一劳永逸&#xff0c;这个操作对你用 Navicat 连接数据库完…

作者头像 李华
网站建设 2026/7/28 6:41:27

【Matlab】把视频里每一帧存为单独的图片

该MATLAB代码实现视频帧提取功能&#xff1a;首先清除工作区并关闭所有窗口&#xff0c;然后读取指定MP4视频文件&#xff0c;获取视频总帧数。通过循环逐帧读取视频内容&#xff0c;使用imshow显示每一帧&#xff0c;并将各帧以BMP格式保存为单独图像文件&#xff08;按帧序号…

作者头像 李华
网站建设 2026/7/28 12:31:31

五种编程语言的“Hello World”深度解析

引言&#xff1a;为什么从“Hello World”开始&#xff1f; “Hello World”程序是编程世界的传统入门仪式&#xff0c;它不仅是学习新语言的第一步&#xff0c;更体现了不同语言的设计哲学和生态系统。这个简单的程序背后&#xff0c;隐藏着语言特性、编译过程、运行环境和编…

作者头像 李华
网站建设 2026/7/27 7:06:10

智能合同系统,让合同管理更高效、更安全

智能合同系统&#xff0c;为企业合同管理上一把安全锁 企业在日常运营中&#xff0c;合同管理是一项至关重要却又繁琐复杂的工作。从合同的起草、审核、签订到执行和归档&#xff0c;每一个环节都需要耗费大量的时间和精力&#xff0c;而且还存在着诸多风险。智能合同系统的出…

作者头像 李华
网站建设 2026/7/22 8:05:25

BentoPDF - 隐私优先的浏览器端免费 PDF 工具箱

项目标题与描述 BentoPDF 是一个强大、以隐私为先、客户端运行的 PDF 工具套件&#xff0c;支持自托管。它允许您直接在浏览器中操作、编辑、合并和处理 PDF 文件&#xff0c;无需服务器端处理&#xff0c;确保您的文件始终保持安全和私密。 项目的核心目标是提供一个完全免费、…

作者头像 李华