mirror of
https://github.com/TheAlgorithms/Python.git
synced 2024-11-23 21:11:08 +00:00
[Add] : Job Sequence program under GREEDY methods (#10482)
* to add job seq program * to add job seq program * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * to add definitions in parameters * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * to add definitions in parameters * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * to add definitions in parameters * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * changes as recommended * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * type hint error resolved * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * removed lambda * [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci * import stmts order * Update and rename job_sequence.py to job_sequence_with_deadline.py --------- Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> Co-authored-by: Christian Clauss <cclauss@me.com>
This commit is contained in:
parent
1ebae5d43e
commit
85cdb93a0d
62
scheduling/job_sequence_with_deadline.py
Normal file
62
scheduling/job_sequence_with_deadline.py
Normal file
|
@ -0,0 +1,62 @@
|
|||
"""
|
||||
Given a list of tasks, each with a deadline and reward, calculate which tasks can be
|
||||
completed to yield the maximum reward. Each task takes one unit of time to complete,
|
||||
and we can only work on one task at a time. Once a task has passed its deadline, it
|
||||
can no longer be scheduled.
|
||||
|
||||
Example :
|
||||
tasks_info = [(4, 20), (1, 10), (1, 40), (1, 30)]
|
||||
max_tasks will return (2, [2, 0]) -
|
||||
Scheduling these tasks would result in a reward of 40 + 20
|
||||
|
||||
This problem can be solved using the concept of "GREEDY ALGORITHM".
|
||||
Time Complexity - O(n log n)
|
||||
https://medium.com/@nihardudhat2000/job-sequencing-with-deadline-17ddbb5890b5
|
||||
"""
|
||||
from dataclasses import dataclass
|
||||
from operator import attrgetter
|
||||
|
||||
|
||||
@dataclass
|
||||
class Task:
|
||||
task_id: int
|
||||
deadline: int
|
||||
reward: int
|
||||
|
||||
|
||||
def max_tasks(tasks_info: list[tuple[int, int]]) -> list[int]:
|
||||
"""
|
||||
Create a list of Task objects that are sorted so the highest rewards come first.
|
||||
Return a list of those task ids that can be completed before i becomes too high.
|
||||
>>> max_tasks([(4, 20), (1, 10), (1, 40), (1, 30)])
|
||||
[2, 0]
|
||||
>>> max_tasks([(1, 10), (2, 20), (3, 30), (2, 40)])
|
||||
[3, 2]
|
||||
>>> max_tasks([(9, 10)])
|
||||
[0]
|
||||
>>> max_tasks([(-9, 10)])
|
||||
[]
|
||||
>>> max_tasks([])
|
||||
[]
|
||||
>>> max_tasks([(0, 10), (0, 20), (0, 30), (0, 40)])
|
||||
[]
|
||||
>>> max_tasks([(-1, 10), (-2, 20), (-3, 30), (-4, 40)])
|
||||
[]
|
||||
"""
|
||||
tasks = sorted(
|
||||
(
|
||||
Task(task_id, deadline, reward)
|
||||
for task_id, (deadline, reward) in enumerate(tasks_info)
|
||||
),
|
||||
key=attrgetter("reward"),
|
||||
reverse=True,
|
||||
)
|
||||
return [task.task_id for i, task in enumerate(tasks, start=1) if task.deadline >= i]
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import doctest
|
||||
|
||||
doctest.testmod()
|
||||
print(f"{max_tasks([(4, 20), (1, 10), (1, 40), (1, 30)]) = }")
|
||||
print(f"{max_tasks([(1, 10), (2, 20), (3, 30), (2, 40)]) = }")
|
Loading…
Reference in New Issue
Block a user