Skip to content

Commit dc70a8c

Browse files
committed
match_192
1 parent 7efe09c commit dc70a8c

File tree

5 files changed

+221
-0
lines changed

5 files changed

+221
-0
lines changed

src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -436,6 +436,7 @@ mod kmp;
436436
mod trans_tree;
437437
mod night_match_27;
438438
mod match_191;
439+
mod match_192;
439440
#[cfg(test)]
440441
mod tests {
441442
#[test]

src/match_192/mod.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
mod prob_5429;
2+
mod prob_5430;
3+
mod prob_5431;

src/match_192/prob_5429.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
impl Solution {
2+
pub fn get_strongest(mut arr: Vec<i32>, k: i32) -> Vec<i32> {
3+
arr.sort();
4+
let n = arr.len();
5+
let m = arr[(n-1)/2];
6+
arr.sort_by(|&a,&b| {
7+
let absa = Self::abs(a-m);
8+
let absb = Self::abs(b-m);
9+
if absa == absb {
10+
a.cmp(&b)
11+
} else {
12+
absa.cmp(&absb)
13+
}
14+
});
15+
let mut ans = vec![];
16+
for i in (n-(k as usize)..n).rev() {
17+
ans.push(arr[i]);
18+
}
19+
ans
20+
}
21+
fn abs(x: i32) -> i32 {
22+
if x < 0 {
23+
-x
24+
} else {
25+
x
26+
}
27+
}
28+
}
29+
30+
struct Solution;
31+
32+
#[cfg(test)]
33+
mod tests {
34+
use super::Solution;
35+
36+
#[test]
37+
fn test_get_strongest() {
38+
let test_cases = vec![
39+
(vec![1,2,3,4,5], 2, vec![5,1]),
40+
(vec![1,1,3,5,5], 2, vec![5,5]),
41+
(vec![6,7,11,7,6,8], 5, vec![11,8,6,6,7]),
42+
];
43+
for (nums, k, expect) in test_cases {
44+
assert_eq!(Solution::get_strongest(nums.clone(), k), expect, "nums:{:?} k: {}", nums, k);
45+
}
46+
}
47+
}

src/match_192/prob_5430.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
struct BrowserHistory {
2+
q: Vec<String>,
3+
idx: usize,
4+
}
5+
6+
impl BrowserHistory {
7+
8+
fn new(homepage: String) -> Self {
9+
Self{
10+
q: vec![homepage],
11+
idx: 0,
12+
}
13+
}
14+
15+
fn visit(&mut self, url: String) {
16+
self.q.truncate(self.idx+1);
17+
self.q.push(url);
18+
self.idx += 1;
19+
}
20+
21+
fn back(&mut self, steps: i32) -> String {
22+
let d = self.idx.min(steps as usize);
23+
self.idx -= d;
24+
return self.q[self.idx].clone();
25+
}
26+
27+
fn forward(&mut self, steps: i32) -> String {
28+
let d = self.idx+steps as usize;
29+
if d >= self.q.len() {
30+
self.idx = self.q.len()-1;
31+
} else {
32+
self.idx = d;
33+
}
34+
return self.q[self.idx].clone();
35+
}
36+
}

src/match_192/prob_5431.rs

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
impl Solution {
2+
pub fn min_cost(houses: Vec<i32>, cost: Vec<Vec<i32>>, m: i32, n: i32, target: i32) -> i32 {
3+
let m = m as usize;
4+
let n = n as usize;
5+
let target = target as usize;
6+
let mut f = vec![vec![vec![std::i32::MAX; n+1]; target+1]; m+1];
7+
// 初始化
8+
if houses[0] > 0 {
9+
f[0][1][houses[0] as usize] = 0;
10+
} else {
11+
for c in 1..=n {
12+
f[0][1][c] = cost[0][c-1];
13+
}
14+
}
15+
// 枚举房子
16+
for i in 1..m {
17+
// 枚举街区
18+
for j in 1..=target {
19+
// 如果当前房子已经着色
20+
if houses[i] > 0 {
21+
let hc = houses[i] as usize;
22+
// 和前面一样
23+
if f[i-1][j][hc] != std::i32::MAX {
24+
f[i][j][hc] = f[i-1][j][hc];
25+
}
26+
// 新街区
27+
for k in 1..=n {
28+
if k != hc && f[i-1][j-1][k] != std::i32::MAX {
29+
f[i][j][hc] = f[i][j][hc].min(f[i-1][j-1][k]);
30+
}
31+
}
32+
continue;
33+
}
34+
// 当前房子没颜色,枚举一个
35+
for c in 1..=n {
36+
if f[i-1][j][c] != std::i32::MAX {
37+
f[i][j][c] = f[i-1][j][c] + cost[i][c-1];
38+
}
39+
for k in 1..=n {
40+
if k != c && f[i-1][j-1][k] != std::i32::MAX {
41+
f[i][j][c] = f[i][j][c].min(f[i-1][j-1][k] + cost[i][c-1]);
42+
}
43+
}
44+
}
45+
}
46+
}
47+
let mut ans = std::i32::MAX;
48+
for c in 1..=n {
49+
ans = ans.min(f[m-1][target][c]);
50+
}
51+
if ans == std::i32::MAX {
52+
-1
53+
} else {
54+
ans
55+
}
56+
}
57+
}
58+
59+
struct Solution;
60+
61+
#[cfg(test)]
62+
mod tests {
63+
use super::Solution;
64+
65+
#[test]
66+
fn test_min_cost() {
67+
let test_cases = vec![
68+
(
69+
vec![0,0,0,3],
70+
vec![
71+
vec![2,2,5],
72+
vec![1,5,5],
73+
vec![5,1,2],
74+
vec![5,2,5],
75+
],
76+
4,3,3,
77+
4
78+
),
79+
(
80+
vec![3,1,2,3],
81+
vec![
82+
vec![1,1,1],
83+
vec![1,1,1],
84+
vec![1,1,1],
85+
vec![1,1,1],
86+
vec![1,1,1],
87+
],
88+
4,3,3,
89+
-1
90+
),
91+
(
92+
vec![0,0,0,0,0],
93+
vec![
94+
vec![1,10],
95+
vec![10,1],
96+
vec![1,10],
97+
vec![10,1],
98+
vec![1,10],
99+
],
100+
5,2,5,
101+
5
102+
),
103+
104+
(
105+
vec![0,2,1,2,0],
106+
vec![
107+
vec![1,10],
108+
vec![10,1],
109+
vec![10,1],
110+
vec![1,10],
111+
vec![5,1],
112+
],
113+
5,2,3,
114+
11
115+
),
116+
(
117+
vec![0,0,0,0,0],
118+
vec![
119+
vec![1,10],
120+
vec![10,1],
121+
vec![10,1],
122+
vec![1,10],
123+
vec![5,1],
124+
],
125+
5,2,3,
126+
9
127+
),
128+
129+
];
130+
for(houses, cost, m,n,target, expect) in test_cases {
131+
assert_eq!(Solution::min_cost(houses.clone(), cost.clone(), m,n,target), expect, "houses:{:?}, cost: {:?}, m:{},n:{},target:{}",houses,cost,m,n,target);
132+
}
133+
}
134+
}

0 commit comments

Comments
 (0)