public static void Scheduler(char[] tasks, int delay, InOut.Ergebnis erg) { Dictionary <char, int> lastPos = new Dictionary <char, int>(); LinkedList <char> list = new LinkedList <char>(); PrioArrayQueue <Payload> q = new PrioArrayQueue <Payload>((p, p2) => p.wait.CompareTo(p2.wait)); q.AddStringConverter(p => p.c + ", "); int time = 0; int count = 0; Wrapper <char> task = new Wrapper <char>(); while (!q.IsEmpty() || count < tasks.Length) { task.IsNull = true; if (count < tasks.Length) { task.Val = tasks[count++]; if (lastPos.ContainsKey(task.Val)) // Check if already encounterd { if (time - lastPos[task.Val] <= delay) // Check if delay time has run out; If then immideatly add to List instead of queuing // Still in Delay { q.Enqueue(new Payload(task.Val, time + 1 + (delay - time + lastPos[task.Val]))); // Put in Prio qeue (calculate minimum next time step) lastPos[task.Val] += delay + 1; // simulate listing by adding delay time continue; } } else { lastPos.Add(task.Val, 0); } } if (task.IsNull) { task.Val = q.Peek().wait <= time?q.Dequeue().c : '/'; } list.AddLast(task.Val); if (task.Val != '/') { lastPos[task.Val] = Math.Max(time, lastPos[task.Val]); } time++; } erg.Setze(list.ToArray()); }
//SOL private static void Solve(int[] arr, InOut.Ergebnis erg) { string res = ""; IQueue <int> q = new PrioArrayQueue <int>(arr[0], (z, z2) => z.CompareTo(z2)); for (int i = 1; i < arr.Length; i++) { if (arr[i] == -1) { q.Dequeue(); } else { q.Enqueue(arr[i]); } } while (!q.IsEmpty()) { res += q.Dequeue() + " "; } erg.Setze(res.Trim(' ')); }