// use itertools::Itertools; use proconio::input; fn main() { input! { n: usize, // 花の数 m: usize, // 部屋の高さ ab: [(usize, usize); n], // (元の高さ,1日に伸びる高さ) } // 各花が最大何日まで放置可能かを調べる let mut day = calc_stay_day(n, m, &ab); // 日数が少ない順にソート day.sort(); // { // println!("{}", day.iter().join(" ")); // } // 1日にとる本数kを二分探索 let ans = bin_search(n, &day); println!("{}", ans); } fn calc_stay_day(_n: usize, m: usize, ab: &Vec<(usize, usize)>) -> Vec { let mut ret = Vec::new(); for &(a, b) in ab { let day = (m - a) / b; ret.push(day); } ret } fn bin_search(n: usize, day: &Vec) -> usize { let mut ng = 0; let mut ok = n+1; for _ in 0..50 { // 1日にとる本数 let mid = (ng + ok) / 2; if isok(n, day, mid) { ok = mid; } else { ng = mid; } } ok } fn isok(n: usize, day: &Vec, k: usize) -> bool { let mut cur_day = 0; let mut cnt = 0; for i in 0..n { if day[i] < cur_day { return false; } cnt += 1; if cnt == k { cur_day += 1; cnt = 0; } } true } // 0日目にk本,1日目にk本... // 今の日数 <= 値をチェック