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

题解:洛谷 P1065 [NOIP 2006 提高组] 作业调度方案

【题目来源】

洛谷:[P1065 NOIP 2006 提高组] 作业调度方案 - 洛谷 (luogu.com.cn)

【题目描述】

我们现在要利用 \(m\) 台机器加工 \(n\) 个工件,每个工件都有 \(m\) 道工序,每道工序都在不同的指定的机器上完成。每个工件的每道工序都有指定的加工时间。

每个工件的每个工序称为一个操作,我们用记号 j-k 表示一个操作,其中 \(j\)\(1\)\(n\) 中的某个数字,为工件号;\(k\)\(1\)\(m\) 中的某个数字,为工序号,例如 2-4 表示第 \(2\) 个工件第 \(4\) 道工序的这个操作。在本题中,我们还给定对于各操作的一个安排顺序。

例如,当 \(n=3,m=2\) 时,1-1,1-2,2-1,3-1,3-2,2-2 就是一个给定的安排顺序,即先安排第 \(1\) 个工件的第 \(1\) 个工序,再安排第 \(1\) 个工件的第 \(2\) 个工序,然后再安排第 \(2\) 个工件的第 \(1\) 个工序,等等。

一方面,每个操作的安排都要满足以下的两个约束条件。

  1. 对同一个工件,每道工序必须在它前面的工序完成后才能开始;
  2. 同一时刻每一台机器至多只能加工一个工件。

另一方面,在安排后面的操作时,不能改动前面已安排的操作的工作状态。

由于同一工件都是按工序的顺序安排的,因此,只按原顺序给出工件号,仍可得到同样的安排顺序,于是,在输入数据中,我们将这个安排顺序简写为 1 1 2 3 3 2

还要注意,“安排顺序”只要求按照给定的顺序安排每个操作。不一定是各机器上的实际操作顺序。在具体实施时,有可能排在后面的某个操作比前面的某个操作先完成。

例如,取 \(n=3,m=2\),已知数据如下(机器号/加工时间):

image

则对于安排顺序 1 1 2 3 3 2,下图中的两个实施方案都是正确的。但所需要的总时间分别是 \(10\)\(12\)

image

当一个操作插入到某台机器的某个空档时(机器上最后的尚未安排操作的部分也可以看作一个空档),可以靠前插入,也可以靠后或居中插入。为了使问题简单一些,我们约定:在保证约束条件(1)(2)的条件下,尽量靠前插入。并且,我们还约定,如果有多个空档可以插入,就在保证约束条件(1)(2)的条件下,插入到最前面的一个空档。于是,在这些约定下,上例中的方案一是正确的,而方案二是不正确的。

显然,在这些约定下,对于给定的安排顺序,符合该安排顺序的实施方案是唯一的,请你计算出该方案完成全部任务所需的总时间。

【输入】

\(1\) 行为两个正整数 \(m,n\),用一个空格隔开, (其中 \(m(\lt 20)\) 表示机器数,\(n(\lt 20)\) 表示工件数)

第 2 行:\(m\times n\) 个用空格隔开的数,为给定的安排顺序。

接下来的 \(2n\) 行,每行都是用空格隔开的 \(m\) 个正整数,每个数不超过 \(20\)

其中前 \(n\) 行依次表示每个工件的每个工序所使用的机器号,第 \(1\) 个数为第 \(1\) 个工序的机器号,第 \(2\) 个数为第 \(2\) 个工序机器号,等等。

\(n\) 行依次表示每个工件的每个工序的加工时间。

可以保证,以上各数据都是正确的,不必检验。

【输出】

\(1\) 个正整数,为最少的加工时间。

【输入样例】

2 3
1 1 2 3 3 2
1 2 
1 2 
2 1
3 2 
2 5 
2 4

【输出样例】

10

【算法标签】

《洛谷 P1065 作业调度方案》 #模拟# #NOIP提高组# #2006#

【代码详解】

#include <iostream>
using namespace std;// 定义结构体,存储每个工件在每个工序的信息
struct information
{int id;  // 机器编号int cost; // 加工时间
} info[22][22]; // info[i][j] 表示第i个工件的第j个工序的信息int list[404] = {0}; // 工件的加工顺序列表
int step[22] = {0}; // 记录每个工件当前进行到第几个工序
int last_time[22] = {0}; // 记录每个工件上一次加工完成的时间
int mac[22][100000] = {0}; // 记录每台机器的占用情况,mac[i][j]=1表示第i台机器在第j时刻被占用
int ans = 0; // 记录所有工件完成加工的最晚时间int main()
{int m, n; // m 表示机器数量,n 表示工件数量cin >> m >> n; // 输入机器数量和工件数量// 输入工件的加工顺序for (int i = 1; i <= m * n; i++)cin >> list[i];// 输入每个工件的每个工序所使用的机器编号for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> info[i][j].id;// 输入每个工件的每个工序的加工时间for (int i = 1; i <= n; i++)for (int j = 1; j <= m; j++)cin >> info[i][j].cost;// 模拟加工过程for (int i = 1; i <= m * n; i++){int now = list[i]; // 当前要加工的工件编号step[now]++; // 当前工件的工序数加1int machine = info[now][step[now]].id; // 当前工序使用的机器编号int time = info[now][step[now]].cost; // 当前工序的加工时间int s = 0; // 记录连续空闲时间段的长度// 从上次加工完成时间+1开始,寻找一个连续的空闲时间段for (int j = last_time[now] + 1; ; j++){if (mac[machine][j] == 0) // 如果当前时刻机器空闲s++; // 连续空闲时间加1elses = 0; // 如果机器被占用,重置连续空闲时间// 如果找到足够长的连续空闲时间段if (s == time){// 占用这段时间for (int k = j - time + 1; k <= j; k++)mac[machine][k] = 1; // 标记机器在这段时间被占用// 更新所有工件完成加工的最晚时间if (j > ans)ans = j;// 更新当前工件的上一次加工完成时间last_time[now] = j;break; // 跳出循环}}}// 输出所有工件完成加工的最晚时间cout << ans;return 0;
}

【运行结果】

2 3
1 1 2 3 3 2
1 2 
1 2 
2 1
3 2 
2 5 
2 4
10
http://www.jsqmd.com/news/388990/

相关文章:

  • mPLUG视觉问答新手入门:从零开始搭建图片理解系统
  • DASD-4B-Thinking多场景落地:嵌入Notion插件、Obsidian AI助手生态
  • 题解:洛谷 P1786 帮贡排序
  • 题解:洛谷 P1271 【深基9.例1】选举学生会
  • 实时口罩检测模型性能优化:从理论到实践
  • 题解:洛谷 B3984 [语言月赛 202406] 编程学习
  • 基于Qwen3-ForcedAligner-0.6B的语音转文字Java开发指南
  • 使用VSCode调试Qwen3-Reranker-8B模型的完整指南
  • 实测好用!AI头像生成器提示词优化功能详解
  • Qwen2.5-32B-Instruct保姆级教程:3步完成多语言文本生成环境配置
  • AI绘画零门槛:SDXL 1.0电影级绘图工坊使用指南
  • 题解:洛谷 P1591 阶乘数码
  • Photoshop 图形与图像处理优秀的技术——第9章:实践训练5——文字和路径
  • 基于VMware虚拟机的SenseVoice-Small开发环境搭建教程
  • YOLO X Layout与OpenCV高级集成:图像预处理优化方案
  • 读人工智能全球格局:未来趋势与中国位势07大国角逐
  • 题解:洛谷 P1067 [NOIP 2009 普及组] 多项式输出
  • 基于Vue.js的CTC语音唤醒模型Web前端交互设计
  • Nano-Banana Studio高级教程:使用Docker容器化部署服装AI应用
  • 达摩院春联模型应用:老年大学智能助老春联创作教学工具开发
  • AutoGen Studio生产环境部署:Qwen3-4B-Instruct支撑多并发Agent请求的稳定性验证
  • Qwen3-ForcedAligner低资源优化:在树莓派上的轻量化部署方案
  • 题解:洛谷 P1098 [NOIP 2007 提高组] 字符串的展开
  • Yi-Coder-1.5B部署指南:个人电脑也能运行的AI编程助手
  • PETRV2-BEV开源大模型训练:BEV空间多尺度特征提取效果可视化
  • SeqGPT-560M使用技巧:如何定义最佳提取标签
  • AI历史着色师DDColor体验:让黑白记忆重现鲜活色彩
  • DCT-Net模型与传统图像处理算法的效果对比分析
  • Pi0机器人控制中心虚拟现实:VR远程操作界面开发
  • 多模态AI神器Janus-Pro-7B体验:图片描述+文生图全流程