diff --git a/src/main.rs b/src/main.rs index 3824058..d488f45 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,66 +1,33 @@ -use std::cmp::min; +use std::cmp::max; struct Solution; impl Solution { - pub fn make_the_integer_zero(num1: i32, num2: i32) -> i32 { - fn max_able_contains_two(number: u64) -> i64{ - let mut ans : i64= 0; - let mut index = 0; - for i in 0..64 { - if (number >> i) & 1 == 1 { - ans += 2_i64.pow(index); + pub fn min_operations(queries: Vec>) -> i64 { + let mut ans: i64 = 0; + let splits = vec![0,1,4,16,64,256,1024,4096,16384,65536,262144,1048576,4194304,16777216,67108864,268435456,1073741824]; + for query in queries { + let l = query[0]; + let r = query[1]; + let mut local_ans:i64 = 0; + for i in 1..splits.len() { + let split = splits[i]; + if split < l { + continue; } - index += 1; - } - ans - } - fn check(num1: i64, num2: i64, k: i64) -> bool { - let new_num1 = num1 - k * num2; - if new_num1 < 0 { - return false; - } - let max_cnt = max_able_contains_two(new_num1 as u64); - let min_cnt = new_num1.count_ones() as i64; - k >= min_cnt && k <= max_cnt - } - let mut l = 0; - let mut r = 1_000_000_010; - let num1 = num1 as i64; - let num2 = num2 as i64; - if num2 > 0 { - r = min(r, num1 / num2); - let mut have_ans = false; - for i in (0..r + 1).rev() { - if check(num1,num2,i) { - r = i; - have_ans = true; + let left = max(l, splits[i-1]); + if split > r { + local_ans += (r - left + 1) as i64 * (i-1) as i64; break; } + local_ans += (split - left ) as i64 * (i-1) as i64; } - if !have_ans { - return -1; - } + ans += local_ans / 2 + local_ans % 2; } - - while l < r { - let mid = (l + r) / 2; - if check(num1, num2, mid) { - r = mid; - }else { - l = mid + 1; - } - } - if l == 1_000_000_010 { return -1; } - for i in 1..l + 1 { - if check(num1, num2, i) { - return i as i32; - } - } - -1 + ans } } fn main() { - let sl = Solution::make_the_integer_zero(34,9); + let sl = Solution::min_operations(vec![vec![1,2],vec![2,4]]); println!("{:?}", sl); }