休日開始曜日で全探索。(実際には、予定のある曜日だけを休日開始曜日とすればよい)
または、予定を覆うような曜日区間の区間長がa以下のものがあるか、と考える。
fn solve2(&self) -> Answer {
// ソートによる解法
let a = self.a;
let b = self.b;
let n = self.n;
let ds = &self.ds;
// 各予定の曜日(今日を0とする)のリスト
let ds_mod = ds.iter().copied().map(|x| x % (a + b)).collect_vec();
let ds_mod_plus_apb = ds_mod.iter().copied().map(|x| x + (a + b)).collect_vec();
let ds_mod_loop = chain!(ds_mod, ds_mod_plus_apb).sorted().collect_vec();
let ans = (0..n)
// iから始まるn個の予定の曜日を含む曜日区間の長さの最小値
.map(|i| ds_mod_loop[n + i - 1] - ds_mod_loop[i] + 1) // i..i+n での区間の最大-最小 + 1
.any(|x| x <= a);
Answer { ans }
}
円環上の集合をある種の区間で覆うときの最小区間長を求める
問題
制約
例
$[[6], [2]] = \{[6], [0], [1], [2]\}$ の要素数 $4$ が答え
方針
解法
let xs_rep_sorted = xs
.iter()
.copied()
.map(|x| x % n)
.sorted()
.dedup()
.collect_vec();
let ans = xs_rep_sorted
.iter()
.copied()
.circular_tuple_windows()
.map(|(end_inclusive, begin)| (end_inclusive - begin).rem_euclid(n) + 1)
.min()
.unwrap();