3495. 使数组元素都变为零的最少操作次数
This commit is contained in:
parent
dddf4ac7dd
commit
54f6c3f08b
71
src/main.rs
71
src/main.rs
|
@ -1,66 +1,33 @@
|
||||||
use std::cmp::min;
|
use std::cmp::max;
|
||||||
|
|
||||||
struct Solution;
|
struct Solution;
|
||||||
impl Solution {
|
impl Solution {
|
||||||
pub fn make_the_integer_zero(num1: i32, num2: i32) -> i32 {
|
pub fn min_operations(queries: Vec<Vec<i32>>) -> i64 {
|
||||||
fn max_able_contains_two(number: u64) -> i64{
|
let mut ans: i64 = 0;
|
||||||
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];
|
||||||
let mut index = 0;
|
for query in queries {
|
||||||
for i in 0..64 {
|
let l = query[0];
|
||||||
if (number >> i) & 1 == 1 {
|
let r = query[1];
|
||||||
ans += 2_i64.pow(index);
|
let mut local_ans:i64 = 0;
|
||||||
|
for i in 1..splits.len() {
|
||||||
|
let split = splits[i];
|
||||||
|
if split < l {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
index += 1;
|
let left = max(l, splits[i-1]);
|
||||||
}
|
if split > r {
|
||||||
ans
|
local_ans += (r - left + 1) as i64 * (i-1) as i64;
|
||||||
}
|
|
||||||
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;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
local_ans += (split - left ) as i64 * (i-1) as i64;
|
||||||
}
|
}
|
||||||
if !have_ans {
|
ans += local_ans / 2 + local_ans % 2;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
}
|
ans
|
||||||
|
|
||||||
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() {
|
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);
|
println!("{:?}", sl);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue