Pythonで区間スケジューリング問題
n個の仕事があります。各仕事は開始時刻と終了時刻を保持しています。各仕事について、参加するかしないかを選択します。
仕事に参加するならば、開始から終了まで参加しなければなりません。また参加する仕事の時間帯が重なってはいけません。
できるだけ多くの仕事に参加する場合、最大でいくつの仕事に参加することができるでしょうか
# coding=utf-8 # 区間スケジューリング問題 from datetime import datetime class Work(object): def __init__(self, name, start_time, end_time): if type(start_time) == str: start_time = datetime.strptime(start_time, '%Y/%m/%d %H:%M:%S') if type(end_time) == str: end_time = datetime.strptime(end_time, '%Y/%m/%d %H:%M:%S') self.name = name self.start_time = start_time self.end_time = end_time def __repr__(self): return self.name def solve(works): # 終了時間が早い順にソート works.sort(key=lambda x: x.end_time) selected_work = [] current_time = None for work in works: if current_time is None or current_time < work.start_time: selected_work.append(work) current_time = work.end_time return selected_work works = [Work('task1', '2012/12/09 11:00:00', '2012/12/09 13:00:00'), Work('task2', '2012/12/09 12:00:00', '2012/12/09 15:00:00'), Work('task3', '2012/12/09 14:00:00', '2012/12/09 17:00:00'), Work('task4', '2012/12/09 16:00:00', '2012/12/09 19:00:00'), Work('task5', '2012/12/09 18:00:00', '2012/12/09 20:00:00')] selected_work = solve(works) print selected_work # => [task1, task3, task5] print len(selected_work) # => 3