Rust で尺取り
Rust で この問題 が解きたいですが,C-style for は Rust では煩雑になりがちです.
問題 1
let ans = (0..a.len()) .scan((0, 0), |(right, sum), left| { *right += a[*right..] .iter() .position(|&a| { *sum + a > k || { *sum += a; false } }) .unwrap_or(a[*right..].len()); *sum -= a[left]; Some(*right - left) }) .sum::<usize>();
問題 2
let ans = (0..a.len()) .scan((0, 0), |(right, sum), left| { *right += a[*right..] .iter() .position(|&a| { *sum + a > k || { *sum += a; false } }) .unwrap_or(a[*right..].len()); *sum -= a[left]; Some(a.len() - *right) }) .sum::<usize>();
解説
なし
おわりに
cond && { expr; true }
の良い感じの改善策を募集しています.