2 条题解
-
0
//0.输入 //1.按照给定安排顺序,找到一个需要插入的工件 //2.找到这个工件,当前需要插入的工序 //3.找到这个工序需要插在哪个机器上 //4.找到这个工序需要花费的时间 //5.找到这个工序,当前能开始的最早的时间 //6.在当前机器上,以最早的时间为起点,从左往右扫,找到一个能放这个工序的空位。 //7.将这个工序放到空位上 //8.将这段时间,标记为在工作 #include<cstdio> #include<iostream> using namespace std; int i,j,k,m,n,ans; int a[405]; //安排顺序 int mord[21][21],t[21][21]; int cnt[21],last_[21]; //last_ 每个工件最晚时间 bool rec[21][8001]; //每台机器的每个时间是否被占用 int main() { scanf("%d%d",&m,&n); for (i=1; i<=m*n; i++) scanf("%d",&a[i]); for (i=1; i<=n; i++) for (j=1; j<=m; j++) scanf("%d",&mord[i][j]); for (i=1; i<=n; i++) for (j=1; j<=m; j++) scanf("%d",&t[i][j]); for (i=1; i<=m*n; i++) { cnt[a[i]]++; int tmp1=a[i],tmp2=cnt[tmp1]; //tmp1:工件 tmp2:工序 int tmpm=mord[tmp1][tmp2]; //机器号 //t[tmp1][tmp2] for (j=last_[tmp1];;j++) { bool flag = 1; for (k=j+1; k<=j+t[tmp1][tmp2]; k++) if (rec[tmpm][k]) { flag = 0; break; } if (flag) { for (k=j+1; k<=j+t[tmp1][tmp2]; k++) rec[tmpm][k] = 1; //扔入空档 last_[tmp1] = max(last_[tmp1],j+t[tmp1][tmp2]); ans = max(ans,last_[tmp1]); //将新覆盖的结束点更新 //printf("%d : %d %d\n",i,j+1,j+t[tmp1][tmp2]); break; } } } printf("%d",ans); return 0; } -
-2
题目通俗解读 核心任务:用m台机器加工n个工件,每个工件要按顺序完成m道工序,每道工序在指定机器上加工。按给定的操作顺序(工件号序列),在满足规则的前提下安排所有工序,计算总加工时间。 关键规则解析 两大约束: 工序顺序:同一工件的工序必须按1→2→…→m的顺序完成,例如工件1的工序2必须在工序1结束后才能开始。 机器独占:一台机器同一时间只能加工一个工序 xiaopangoj.com 。 安排顺序: 输入的工件号序列决定了操作的处理顺序。例如序列[1,1,2,3,3,2]表示依次处理:工件1的第1道工序→工件1的第2道工序→工件2的第1道工序→…→工件2的第2道工序 CSDN博客 。 插入规则: 尽量靠前:每个操作必须放在最早可能的时间,且优先选择最前面的空档。例如机器有多个空闲时段时,选第一个能容纳该操作的空档 xiaopangoj.com 。 输入输出说明 输入: 第1行:机器数m和工件数n(均<20)。 第2行:m×n个工件号,为操作安排顺序。 接下来2n行:前n行为每个工件各工序的机器号,后n行为各工序的加工时间 xiaopangoj.com 。 输出: 完成所有工序的最少总时间。 示例解析(样例输入) 输入: 2 3 1 1 2 3 3 2 1 2 // 工件1工序1用机器1,工序2用机器2 1 2 // 工件2工序1用机器1,工序2用机器2 2 1 // 工件3工序1用机器2,工序2用机器1 3 2 // 工件1工序1耗时3,工序2耗时2 2 5 // 工件2工序1耗时2,工序2耗时5 2 4 // 工件3工序1耗时2,工序2耗时4 安排过程: 工件1-工序1(机器1,3分钟):最早开始,占时间1-3。 工件1-工序2(机器2,2分钟):需等工件1-工序1完成(时间3),机器2此时空闲,占时间4-5。 工件2-工序1(机器1,2分钟):需等机器1空闲(时间3),占时间4-5。 工件3-工序1(机器2,2分钟):机器2最早空闲时段为1-3,占时间1-2。 工件3-工序2(机器1,4分钟):需等工件3-工序1完成(时间2),机器1在5后空闲,占时间6-9。 工件2-工序2(机器2,5分钟):需等工件2-工序1完成(时间5),机器2在5后空闲,占时间6-10。 总时间:所有工序完成的最晚时间为10。 为何方案2错误? 方案2中,工件3-工序2(机器1,4分钟)被安排在8-11,违反“尽量靠前”原则。机器1在5后即空闲,应优先安排在6-9 核心思路 记录状态:跟踪每个工件各工序的完成时间,以及每台机器的已占用时段。 计算空档:对每个操作,找出其所需机器的所有空闲时段,选择最早能容纳该操作的空档。 更新数据:插入操作后,更新工件工序完成时间和机器占用情况。 通过模拟上述过程,即可唯一确定调度方案并计算总时间。
- 1
信息
- ID
- 307
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- (无)
- 递交数
- 35
- 已通过
- 22
- 上传者