From efb0b723b155a3cc900657358eb1c65a3431a0a8 Mon Sep 17 00:00:00 2001 From: SquidSpirit Date: Fri, 19 Sep 2025 00:21:19 +0800 Subject: [PATCH] feat: 3408_design_task_manager --- 3408_design_task_manager/Cargo.lock | 7 +++ 3408_design_task_manager/Cargo.toml | 6 +++ 3408_design_task_manager/src/lib.rs | 78 +++++++++++++++++++++++++++++ 3 files changed, 91 insertions(+) create mode 100644 3408_design_task_manager/Cargo.lock create mode 100644 3408_design_task_manager/Cargo.toml create mode 100644 3408_design_task_manager/src/lib.rs diff --git a/3408_design_task_manager/Cargo.lock b/3408_design_task_manager/Cargo.lock new file mode 100644 index 0000000..2b5184a --- /dev/null +++ b/3408_design_task_manager/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "design_task_manager" +version = "0.1.0" diff --git a/3408_design_task_manager/Cargo.toml b/3408_design_task_manager/Cargo.toml new file mode 100644 index 0000000..99d45a5 --- /dev/null +++ b/3408_design_task_manager/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "design_task_manager" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/3408_design_task_manager/src/lib.rs b/3408_design_task_manager/src/lib.rs new file mode 100644 index 0000000..3831f89 --- /dev/null +++ b/3408_design_task_manager/src/lib.rs @@ -0,0 +1,78 @@ +use std::collections::{BinaryHeap, HashMap}; + +#[derive(Clone, PartialEq, Eq)] +pub struct Task { + pub uid: i32, + pub pid: i32, + pub priority: i32, +} + +impl Ord for Task { + fn cmp(&self, other: &Self) -> std::cmp::Ordering { + self.priority + .cmp(&other.priority) + .then(self.pid.cmp(&other.pid)) + .then(self.uid.cmp(&other.uid)) + } +} + +impl PartialOrd for Task { + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +pub struct TaskManager { + tasks: HashMap, + max_heap: BinaryHeap, +} + +impl TaskManager { + pub fn new(tasks_vec: Vec>) -> Self { + let tasks_iter = tasks_vec.iter().map(|t| Task { + uid: t[0], + pid: t[1], + priority: t[2], + }); + + Self { + tasks: HashMap::from_iter(tasks_iter.clone().map(|t| (t.pid, t))), + max_heap: BinaryHeap::from_iter(tasks_iter), + } + } + + pub fn add(&mut self, uid: i32, pid: i32, priority: i32) { + let task = Task { uid, pid, priority }; + self.tasks.insert(pid, task.clone()); + self.max_heap.push(task); + } + + pub fn edit(&mut self, pid: i32, new_priority: i32) { + let task = self.tasks.get_mut(&pid).unwrap(); + task.priority = new_priority; + self.max_heap.push(task.clone()); + } + + pub fn rmv(&mut self, pid: i32) { + self.tasks.remove(&pid); + } + + pub fn exec_top(&mut self) -> i32 { + let mut result_task: Option = None; + + while let Some(top_task) = self.max_heap.peek() { + if let Some(task) = self.tasks.get(&top_task.pid) + && task == top_task + { + result_task = Some(task.clone()); + self.tasks.remove(&top_task.pid); + self.max_heap.pop(); + break; + } else { + self.max_heap.pop(); + } + } + + result_task.map_or(-1, |t| t.uid) + } +}