diff --git a/src/main.rs b/src/main.rs index c209fee..ed3759f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,75 +1,75 @@ -use std::cmp::max; +use std::cmp::{max, min}; +use std::mem::swap; struct Solution; mod arr; impl Solution { - pub fn maximum_amount(coins: Vec>) -> i32 { - let mut arr = vec![vec![vec![-1e9 as i32; 3]; coins[0].len()]; coins.len()]; - arr[0][0][0] = coins[0][0]; - - arr[0][0][1] = max(0, coins[0][0]); - arr[0][0][2] = max(0, coins[0][0]); - for j in 1..coins[0].len() { - if coins[0][j] < 0 { - arr[0][j][0] = arr[0][j - 1][0] + coins[0][j]; - arr[0][j][1] = max(arr[0][j - 1][1] + coins[0][j], arr[0][j-1][0]); - arr[0][j][2] = max(arr[0][j - 1][2] + coins[0][j], arr[0][j-1][1]); + pub fn max_walls(robots: Vec, distance: Vec, walls: Vec) -> i32 { + let mut walls = walls; + let mut rd = robots + .iter() + .zip(distance.iter()) + .collect::>(); + rd.sort_unstable_by(|a, b| a.0.cmp(b.0)); + walls.sort_unstable(); + let mut dp = vec![vec![0; 2]; 2]; + let (mut lastrr, mut last_robot) = (0, 0); + let (mut x,mut y) = (0, 1); + for i in 0..rd.len() { + let (robot, dis) = rd[i]; + // 第一个能打到的 + let ll_theory = walls.partition_point(|&v| *robot - *dis > v); + // 第一个打不到的 + let lr_theory = walls.partition_point(|&v| *robot >= v); + // 第一个能打到的 + let rl_theory = walls.partition_point(|&v| *robot > v); + // 第一个打不到的 + let rr_theory = walls.partition_point(|&v| *robot + *dis >= v); + // 因bot阻挡 最后一个打不到的 + let robot_l_idx = last_robot; + let robot_r_idx = if i != rd.len() - 1 { + walls.partition_point(|&v| *rd[i + 1].0 > v) } else { - arr[0][j][0] = arr[0][j - 1][0] + coins[0][j]; - arr[0][j][1] = arr[0][j - 1][1] + coins[0][j]; - arr[0][j][2] = arr[0][j - 1][2] + coins[0][j]; - } + rr_theory + }; + dp[y][0] = max( + dp[x][0] + lr_theory - max(ll_theory, robot_l_idx), + dp[x][1] + max(0, lr_theory - max(ll_theory, lastrr)), + ); + dp[y][1] = max(dp[x][0], dp[x][1]) + + max( + 0, + max( + min(rr_theory, max(robot_r_idx as i32, 0) as usize) as i32 + - rl_theory as i32, + 0, + ) as usize, + ); + lastrr = min(rr_theory, robot_r_idx); + last_robot = lr_theory; + swap(&mut x, &mut y); } - for i in 1..coins.len() { - if coins[i][0] < 0 { - arr[i][0][0] = arr[i - 1][0][0] + coins[i][0]; - arr[i][0][1] = max(arr[i - 1][0][1] + coins[i][0], arr[i-1][0][0]); - arr[i][0][2] = max(arr[i - 1][0][2] + coins[i][0], arr[i-1][0][1]); - } else { - arr[i][0][0] = arr[i - 1][0][0] + coins[i][0]; - arr[i][0][1] = arr[i - 1][0][1] + coins[i][0]; - arr[i][0][2] = arr[i - 1][0][2] + coins[i][0]; - } - for j in 1..coins[i].len() { - arr[i][j][0] = max(arr[i - 1][j][0], arr[i][j - 1][0]) + coins[i][j]; - if coins[i][j] < 0 { - arr[i][j][1] = max( - max(arr[i - 1][j][1], arr[i][j - 1][1]) + coins[i][j], - max(arr[i - 1][j][0], arr[i][j - 1][0]), - ); - arr[i][j][2] = max( - max(arr[i - 1][j][2], arr[i][j - 1][2]) + coins[i][j], - max(arr[i - 1][j][1], arr[i][j - 1][1]), - ); - } else { - arr[i][j][1] = max(arr[i - 1][j][1], arr[i][j - 1][1]) + coins[i][j]; - arr[i][j][2] = max(arr[i - 1][j][2], arr[i][j - 1][2]) + coins[i][j]; - } - } - } - max( - max( - arr[coins.len() - 1][coins[0].len() - 1][0], - arr[coins.len() - 1][coins[0].len() - 1][1], - ), - arr[coins.len() - 1][coins[0].len() - 1][2], - ) + max(dp[x][0], dp[x][1]) as i32 } } fn main() { - let result = Solution::maximum_amount(arr::make_matrix(r"[[-6,-15,-16,-8],[-10,11,6,16],[1,2,18,12],[15,19,4,17]]")); + let result = Solution::max_walls( + vec![ + 63, 56, 40, 45, 4, 9, 44, 69, 55, 26, 73, 15, 12, 60, 43, 39, 37, 74, 36, 34, 13, 23, + 66, 14, 11, 42, 72, 3, 57, 10, 53, 8, 70, 17, 58, 61, 30, 32, + ], + vec![ + 8, 7, 4, 8, 9, 5, 2, 4, 5, 2, 6, 9, 5, 9, 5, 3, 7, 6, 9, 2, 8, 7, 4, 3, 5, 1, 7, 5, 1, + 3, 5, 3, 5, 4, 8, 7, 6, 4, + ], + vec![6, 22, 50, 52, 20, 9, 23, 75, 26, 21, 60, 58, 41, 28, 30], + ); println!("{:?}", result); } /* -[[-6,-15,-16,-8], -[-10,11,6,16], -[1,2,18,12], -[15,19,4,17]] +[(3, 5), (4, 9), (8, 3), (9, 5), (10, 3), (11, 5), (12, 5), (13, 8), (14, 3), (15, 9), (17, 4), (23, 7), (26, 2), (30, 6), (32, 4), (34, 2), (36, 9), (37, 7), (39, 3), (40, 4), (42, 1), (43, 5), (44, 2), (45, 8), (53, 5), (55, 5), (56, 7), (57, 1), (58, 8), (60, 9), (61, 7), (63, 8), (66, 4), (69, 4), (70, 5), (72, 7), (73, 6), (74, 6)] +[6, 9, 20, 21, 22, 23, 26, 28, 30, 41, 50, 52, 58, 60, 75] + r6 l6 r6 l9 r9 l9 r21 l23 r23 l26 r28 l30 r30 l30 r41 l41 r41 l41 r52 l52 r52 l58 r58 l60 r60 l60 r75 +[0, 0], [0, 1], [1, 1], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 2], [2, 4], [6, 5], [7, 8], [9, 9], [9, 9], [9, 9], [9, 9], [9, 9], [9, 9], [9, 10], [10, 10], [10, 10], [10, 10], [10, 12], [12, 12], [12, 12], [12, 12], [12, 12], [13, 13], [14, 14], [14, 14], [14, 14], [14, 14], [14, 14], [14, 14], [14, 14], [14, 14], [14, 15]] +14 */ -/* -[[[-6, 0, 0], [-21, -15, -15], [-37, -31, -31], [-45, -39, -39]], - [[-16, -10, -10], [-5, 1, 1], [1, 7, 7], [17, 23, 23]], - [[-15, -9, -9], [-3, 3, 3], [19, 25, 25], [31, 37, 37]], - [[0, 6, 6], [19, 25, 25], [23, 29, 29], [48, 54, 54]]] - - */ \ No newline at end of file