問題描述
我們現在要利用m臺機器加工n個工件,每個工件都有m道工序,每道工序都在不同的指定的機器上完成。每個工件的每道工序都有指定的加工時間。
一方面,每個操作的安排都要滿足以下的兩個約束條件。
(1) 對同乙個工件,每道工序必須在它前面的工序完成後才能開始;
(2) 同一時刻每一台機器至多只能加工乙個工件。
另一方面,在安排後面的操作時,不能改動前面已安排的操作的工作狀態。
還要注意,「安排順序」只要求按照給定的順序安排每個操作。不一定是各機器上的實際操作順序。在具體實施時,有可能排在後面的某個操作比前面的某個操作先完成。約定:在保證約束條件(1)(2)的條件下,盡量靠前插入。並且,我們還約定,如果有多個空檔可以插入,就在保證約束條件(1)(2)的條件下,插入到最前面的乙個空檔。
計算出該方案完成全部任務所需的總時間。
輸入格式
第1行為兩個正整數,用乙個空格隔開:
m n(其中m(<20)表示機器數,n(<20)表示工件數)
第2行:m*n個用空格隔開的數,為給定的安排順序。
接下來的2n行,每行都是用空格隔開的m個正整數,每個數不超過20。
其中前n行依次表示每個工件的每個工序所使用的機器號。
後n行依次表示每個工件的每個工序的加工時間。
可以保證,以上各資料都是正確的,不必檢驗。
輸出格式
只有乙個正整數,為最少的加工時間。
解題演算法
【模擬】
解題思路:
順向思維模擬即可
因為各個物品放置法則等同
所以可以用函式進行m*n次處理
每個物品找到第一段時間足以容納自身的區間,然後改變區間狀態即可
有個小細節
每次放完乙個物品後下乙個次序要從這次的尾端之後開始
很好控制的
**:int mtp=mach[id][front[id]];
int ct=tim[id][front[id]];
int sub=last[id];
while(1)
f(i,1,ct)
vit[mtp][sub+i]=1;
ans=max(ans,sub+ct);
last[id]=sub+ct;
front[id]++;
以上、ac
模擬套路大同小異,聞一知十。
以上2018.2.13
NOIP2006T 能量項鍊
描述 在mars星球上,每個mars人都隨身佩帶著一串能量項鍊。在項鍊上有n顆能量珠。能量珠是一顆有頭標記與尾標記的珠子,這些標記對應著某個正整數。並且,對於相鄰的兩顆珠子,前一顆珠子的尾標記一定等於後一顆珠子的頭標記。因為只有這樣,通過吸盤 吸盤是mars人吸收能量的一種器官 的作用,這兩顆珠子才...
NOIP 2006 作業排程方案
題目描述 我們現在要利用m臺機器加工n個工件,每個工件都有m道工序,每道工序都在不同的指定的機器上完成。每個工件的每道工序都有指定的加工時間。每個工件的每個工序稱為乙個操作,我們用記號j k表示乙個操作,其中j為1到n中的某個數字,為工件號 k為1到m中的某個數字,為工序號,例如2 4表示第2個工件...
NOIP 2006 作業排程方案
我們現在要利用m臺機器加工n個工件,每個工件都有m道工序,每道工序都在不同的指定的機器上完成。每個工件的每道工序都有指定的加工時間。每個工件的每個工序稱為乙個操作,我們用記號j k表示乙個操作,其中j為1到n中的某個數字,為工件號 k為1到m中的某個數字,為工序號,例如2 4表示第2個工件第4道工序...