public void GetAnswerB() { Console.WriteLine("Answer B: "); ParseInput(path); var orderedSteps = steps.OrderBy(x => x.Key).ToList(); Worker[] workers = new Worker[5]; for (int i = 0; i < workers.Length; i++) { workers[i] = new Worker(); } int time = 0; bool waitFlag = false; while (orderedSteps.Count > 0) { for (int j = 0; j < workers.Length; j++) { Worker w = workers[j]; if (w.step == null && !waitFlag) { //find the next step to work on w.GetStep(orderedSteps); } if (w.step != null) { //process step w.step.stepTime--; //Console.Write(string.Format("{0} ", w.step.stepId)); if (w.step.stepTime < 1) { for (int i = 0; i < orderedSteps.Count; i++) { if (orderedSteps[i].Value.stepPrerequisites.Contains(w.step.stepId)) { requirementCount--; } orderedSteps[i].Value.stepPrerequisites.Remove(w.step.stepId); } w.step = null; w.GetStep(orderedSteps); waitFlag = true; } } //else //{ // Console.Write("- "); //} } time++; //Console.Write("\n"); waitFlag = false; } //get any remaining time after initial calculate, because it ends before allowing workers to finish their task foreach (Worker w in workers) { while (w.step != null) { time++; w.step.stepTime--; //Console.WriteLine(string.Format("{0} ", w.step.stepId)); if (w.step.stepTime < 1) { w.step = null; } } } Console.WriteLine("Time: " + time); }