P1065 [NOIP2006 提高组] 作业调度方案

模拟题,要命。。。

P1065 [NOIP2006 提高组] 作业调度方案 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题目大意:

输入m,n表示,有m台机器,n个工件,每个工件有m道工序

输入n*m个数据,表示处理顺序

输入n行,每行m个数据,表示,每个工序用哪个机器处理

输入n行,每行m个数据,表示,每个工序所用的时间

求处理完所有的工件所用的时间

约束条件:

  1. 对同一个工件,每道工序必须在它前面的工序完成后才能开始;

  2. 同一时刻每一台机器至多只能加工一个工件

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

 

 模拟题中材料分析和细节把控十分重要,是有用信息归纳,再有完整思维导图,再反映到代码的过程

检查技巧:若逻辑全部正确,推敲过后仍合理,可以看看for循环中的赋值细节是否有问题

宁可代码打的慢些,也要保证准确性,否则后期排查极为麻烦,贻害无穷!

 1 //P1065 [NOIP2006 提高组] 作业调度方案
 2 #include<iostream>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=50;
 6 int n,m;
 7 int line[maxn*maxn];//工作顺序 
 8 int workline[maxn][maxn];//处于某工序时,由某台机器处理 
 9 int worktime[maxn][maxn];//某工序的处理时间 
10 int gx[maxn];//工序记录 
11 int lasttime[maxn];//上个工序的结束时间 
12 bool zz[maxn*maxn][maxn*maxn];//某机器在当前时刻是否在工作,扫描用 
13 int ans=0;
14 bool miao(int l,int h,int num)
15 {
16     //检查时间段内是否都未被标记 
17     for(int i=l;i<=h;i++)
18     {
19         if(zz[num][i])
20         return false;
21     }
22     return true;
23 }
24 int main()
25 {
26     cin>>m>>n;
27     for(int i=1;i<=n*m;i++)
28     {
29         cin>>line[i];
30     }
31     for(int i=1;i<=n;i++)
32     {
33         for(int j=1;j<=m;j++)
34         cin>>workline[i][j];
35     }
36     for(int i=1;i<=n;i++)
37     {
38         for(int j=1;j<=m;j++)
39         cin>>worktime[i][j];
40     }
41     for(int i=1;i<=n*m;i++)
42     {
43         int a=line[i];//要处理哪个 
44         gx[a]++;//工序记录 
45         int nowrb=workline[a][gx[a]];//机器记录 
46         int nowt=worktime[a][gx[a]];//时间记录 
47         for(int t=lasttime[a]+1;;t++)//扫描时间轴 
48         {
49             if(miao(t,t+nowt-1,nowrb))
50             {
51                 //标记时间段 
52                 for(int j=t;j<=t+nowt-1;j++)
53                 {
54                     zz[nowrb][j]=true;
55                 }
56                 //记录结束时间 
57                 lasttime[a]=t+nowt-1;
58                 break;
59             }
60         }
61     }
62     //寻找最大的结束时间 
63     for(int i=1;i<=n;i++)
64     {
65         ans=max(ans,lasttime[i]);
66     }
67     cout<<ans<<endl;
68     return 0;
69 }

 

posted @ 2022-06-26 15:41  格蕾  阅读(105)  评论(0编辑  收藏  举报