haar_lib/algo/
interval_scheduling.rs

1//! 区間スケジューリング問題
2
3/// 半開区間の集合から共通部分を含まないような部分集合のうち、要素数が最大となるものを求める。
4///
5/// **Time complexity** $O(n \log n)$
6pub fn interval_scheduling<T: Ord + Copy>(intervals: &[(T, T)]) -> Vec<usize> {
7    let n = intervals.len();
8    let mut ret = vec![];
9    let mut ord = (0..n).collect::<Vec<_>>();
10    ord.sort_by(|&i, &j| intervals[i].1.cmp(&intervals[j].1));
11
12    let mut r = None;
13
14    for i in ord {
15        if r.is_none() || intervals[i].0 >= r.unwrap() {
16            ret.push(i);
17            r = Some(intervals[i].1);
18        }
19    }
20
21    ret
22}