use std::cmp::Ordering; #[derive(Debug)] struct Job { id: char, deadline: usize, profit: usize, } fn job_scheduling(jobs: &mut Vec<Job>) -> Vec<Option<char>> { jobs.sort_by(|a, b| b.profit.cmp(&a.profit)); let max_deadline = jobs.iter().map(|job| job.deadline).max().unwrap_or(0); let mut result = vec![None; max_deadline]; for job in jobs.iter() { for slot in (0..job.deadline).rev() { if result[slot].is_none() { result[slot] = Some(job.id); break; } } } result } fn main() { let mut jobs = vec![ Job { id: 'a', deadline: 2, profit: 100 }, Job { id: 'b', deadline: 1, profit: 19 }, Job { id: 'c', deadline: 2, profit: 27 }, Job { id: 'd', deadline: 1, profit: 25 }, Job { id: 'e', deadline: 3, profit: 15 }, ]; let schedule = job_scheduling(&mut jobs); println!("{:?}", schedule); }
The jobs are sorted by profit: a(100), c(27), d(25), b(19), e(15).
Schedule 'a' at slot 1 (deadline 2), 'c' at slot 0 (deadline 2), and 'e' at slot 2 (deadline 3). Slots are zero-indexed.
struct Job {
id: char,
deadline: usize,
profit: usize,
}
fn job_scheduling(jobs: &mut Vec<Job>) -> usize {
jobs.sort_by(|a, b| b.profit.cmp(&a.profit));
let max_deadline = jobs.iter().map(|job| job.deadline).max().unwrap_or(0);
let mut result = vec![None; max_deadline];
let mut count = 0;
for job in jobs.iter() {
for slot in (0..job.deadline).rev() {
if result[slot].is_none() {
result[slot] = Some(job.id);
count += 1;
break;
}
}
}
count
}
fn main() {
let mut jobs = vec![
Job { id: 'x', deadline: 1, profit: 20 },
Job { id: 'y', deadline: 2, profit: 15 },
Job { id: 'z', deadline: 2, profit: 10 },
Job { id: 'w', deadline: 1, profit: 5 },
];
let scheduled_count = job_scheduling(&mut jobs);
println!("{}", scheduled_count);
}Jobs sorted by profit: x(20), y(15), z(10), w(5).
Slot 0 (deadline 1) assigned to 'x'.
Slot 1 (deadline 2) assigned to 'y'.
Slot 0 is taken, so 'z' cannot be scheduled at slot 0 but can be at slot 1 which is taken, so 'z' is skipped.
'w' has deadline 1 but slot 0 is taken, so skipped.
Total scheduled jobs: 2 ('x' and 'y').
struct Job {
id: char,
deadline: usize,
profit: usize,
}
fn job_scheduling(jobs: &mut Vec<Job>) -> Vec<Option<char>> {
jobs.sort_by(|a, b| a.profit.cmp(&b.profit));
let max_deadline = jobs.iter().map(|job| job.deadline).max().unwrap_or(0);
let mut result = vec![None; max_deadline];
for job in jobs.iter() {
for slot in (0..job.deadline).rev() {
if result[slot].is_none() {
result[slot] = Some(job.id);
break;
}
}
}
result
}
fn main() {
let mut jobs = vec![
Job { id: 'a', deadline: 2, profit: 100 },
Job { id: 'b', deadline: 1, profit: 19 },
Job { id: 'c', deadline: 2, profit: 27 },
];
let schedule = job_scheduling(&mut jobs);
println!("{:?}", schedule);
}The code sorts jobs by ascending profit (lowest first), which is incorrect for maximizing profit.
This causes low profit jobs to be scheduled first, potentially blocking higher profit jobs.
There is no runtime error or panic.
Sorting jobs by descending profit ensures the most profitable jobs are scheduled first.
Scheduling each job in the latest available slot before its deadline allows more jobs to fit.
Other options do not guarantee maximum profit.
use std::cmp::Ordering; #[derive(Debug)] struct Job { id: char, deadline: usize, profit: usize, } fn job_scheduling(jobs: &mut Vec<Job>) -> Vec<Option<char>> { jobs.sort_by(|a, b| b.profit.cmp(&a.profit)); let max_deadline = jobs.iter().map(|job| job.deadline).max().unwrap_or(0); let mut result = vec![None; max_deadline]; for job in jobs.iter() { for slot in (0..job.deadline).rev() { if result[slot].is_none() { result[slot] = Some(job.id); break; } } } result } fn main() { let mut jobs = vec![ Job { id: 'p', deadline: 3, profit: 40 }, Job { id: 'q', deadline: 1, profit: 100 }, Job { id: 'r', deadline: 2, profit: 20 }, Job { id: 's', deadline: 2, profit: 30 }, Job { id: 't', deadline: 1, profit: 10 }, ]; let schedule = job_scheduling(&mut jobs); println!("{:?}", schedule); }
Jobs sorted by profit: q(100), p(40), s(30), r(20), t(10).
Slot 0 (deadline 1) assigned to 'q'.
Slot 2 (deadline 3) assigned to 'p'.
Slot 1 (deadline 2) assigned to 's'.
Jobs 'r' and 't' cannot be scheduled as slots are occupied.
