P1065 [NOIP 2006 提高组] 作业调度方案 详解

这个题目挺难的对于新手,我理解别人代码后写了一遍,再自己再写了一遍,但仍然吃力

先看题目:

题目很长,但不要怕,怕也躲不了,因为我身后空无一人,分析题目:

新手看不懂,没关系。

1,首先明确一点,有多少机器就有多少工序,因为一台机器对应一个唯一的只有它能做的工序。不存在多个机器做一个工序,也不存在一个工序要多台机器做。

2,格子里面前面第一列表示的是第几个工件,总共有3个工件。

     第二列第一行第一个数据表示它在对于它自己来说做工序1在第一台机器上,第二个数据表示在这台机器上需要3分钟完成。第三列第一行第一个数据表示它在对于它自己来说做工序2在第二台机器上,第二个数据表示在这台机器上需要2分钟完成。

      第二列第二行第一个数据表示它在对于它自己来说做工序1在第一台机器上,第二个数据表示在这台机器上需要2分钟完成。第三列第二行第一个数据表示它在对于它自己来说做工序2在第2台机器上,第二个数据表示在这台机器上需要5分钟完成。

第二列第三行第一个数据表示它在对于它自己来说做工序1在第二台机器上,第二个数据表示在这台机器上需要2分钟完成。第三列第三行第一个数据表示它在对于它自己来说做工序2在第1台机器上,第二个数据表示在这台机器上需要4分钟完成。

所有结论:工序是死的,对于他自己来说先做哪个工序都可以,对成品无影响,但是此工序在哪个机器上做,是活的,多变的,但是题目的输入给了你每个工序在哪个机器上的数据

3,再看输入数据.

第一行是m道工序(也即是告诉你有m个机器),n个工件   2道工序,3个原件

第二行是对于工序的排列顺序,对于第一个原件,先在第一个工序做完,之后再在第二个工序做,对应 1  1  , 之后对于第二个工件先做第一道工序,再对于第三个工件,先在第一个工序做,再在第二个工序做,之后最后对于第二个工件在第二个工序上做 对应 2 3 3 2

此时只告诉你工序的排列顺序,但没告诉你此时的工序在哪个机器上做,此时就与下面的输入数据有关系了

之后的n行,代表对于某个特定的工件,他第一道工序在哪个机器上,第二个工序在哪个机器上,第m道工序在哪个机器上。

再之后的n行代表在其对应的机器上所需用到时间

所有此时,数据串起来了。

如果是我,我会先干啥:

1,接收数据

apsx[  ]  安排顺序

s[  ] 结构体,每个工件的每个工序对应的是哪个机器,相应时间,所以机器号和所需时间是工件的属性

此时你只需要看我的结构体,和apsx[ ] ,其他的数组乱七八糟的不要看,我之后带你再讲为啥要创建,我也不是未卜先知的,只是后面确实需要就创建。

之后输入的数据接收完毕,该做啥,是不是就应该for循环遍历每道工序,为什么遍历每道工序,因为你要思考,大模拟,大模拟,我是不是要模仿此时工厂的运行,他是对于每个工件的每道工序都有安排,而对于每个原件  有 m个工序,所有总共有 n*m个工序

所以此时,我需要在我的安排顺序数组里面找,看他是对不同工件的安排顺序,即是先对哪个工件操作,记住,每一次for大循环一次找一个。此时结构体的数组第一个[ ]坐标找到,就是找到了它是对于哪个工件的操作,而结构体第二个[ ] 代表的是是第几个工序,而结构体的第二个[  ]索引起始点为0,从0开始,所以需要设一个数组,表示工序进行的次数,对于某个唯一的工件,执行m道工序,在apsx[  ] 数组里面会有某个工件重复出现,此时出现2次,3次,4次表示着这次是第二个工序,第三个工序,第四个工序,所以 gj_gx[ ] 里面的索引表示针对某个唯一工件情况,若此工件在之后for循环里面,在 apsx[  ] 数组里面再次出现,说明为下一道工序了,所以要加加在后面,之后若遍历到同一个工件,此时代表的工序应该加加后的工序

之后再通过结构体找到之前输入的数据的机器号,所需时间,通过工件号和工序号就可以找到所在的特定的机器号是哪个,在其上所需时间多少

而次的目的是啥,此时记住,针对的是哪个特定的工件,工件在上一道工序上一台机器的结束时间为下一道工序在下一道机器的结束时间,所以 time_last [  ]  此时里面的索引代表的是某个工件的每次for循环后下一次相同工件下的起始时间

之后要统计此工序在执行之前机器是否被别的工件使用占领,被占领要往后找,所以此时又要设一个数组,模拟每个工件在每个工序上占领的时间,

从起始点往后面筛选,每一次for大循环里面再while小循环判断机器是否被别的原件占领使用,若被占领,开始时间往后不断推迟,直到此机器结束某道工序,再开始新工件的工序

之前的打错了,里面记录的是每个机器的工作时间

之后遍历,找出最大时间

以上为我仿照别人代码敲的,但实际上自己盲写,仍然会有很多问题,以下为我盲打的代码,有所不同:

上一个代码为 工序++,此中必须为 ++工序,所以你发现为什么了吗,考考你细节?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值