@@ -7,33 +7,32 @@ impl Solution {
7
7
pub fn max_performance ( n : i32 , speed : Vec < i32 > , efficiency : Vec < i32 > , k : i32 ) -> i32 {
8
8
let mut groups = speed
9
9
. into_iter ( )
10
- . zip ( efficiency. into_iter ( ) )
11
- . collect :: < Vec < ( i32 , i32 ) > > ( ) ;
10
+ . map ( |x| x as i64 )
11
+ . zip ( efficiency. into_iter ( ) . map ( |x| x as i64 ) )
12
+ . collect :: < Vec < ( i64 , i64 ) > > ( ) ;
12
13
groups. sort_by ( |a, b| b. 1 . cmp ( & a. 1 ) ) ;
13
- let ( speeds, efficiencies) : ( Vec < i32 > , Vec < i32 > ) = groups. iter ( ) . cloned ( ) . unzip ( ) ;
14
+ let ( speeds, efficiencies) : ( Vec < i64 > , Vec < i64 > ) = groups. iter ( ) . cloned ( ) . unzip ( ) ;
14
15
let mut speed_queue = BinaryHeap :: new ( ) ; // lowest priority queue
15
16
let mut total_speed = 0 ;
17
+ let mut result = 0 ;
16
18
for i in 0 ..k as usize {
17
19
speed_queue. push ( Reverse ( speeds[ i] ) ) ;
18
20
total_speed += speeds[ i] ;
21
+ result = result. max ( total_speed * efficiencies[ i] ) ;
19
22
}
20
- let mut result = total_speed * efficiencies[ k as usize - 1 ] ;
21
23
// try another new engineer with lower efficiency
22
24
for i in k as usize ..n as usize {
23
25
let lowest_speed = speed_queue. peek ( ) . unwrap ( ) . 0 ;
24
26
let new_speed = speeds[ i] ;
25
27
if lowest_speed > new_speed {
26
28
continue ;
27
29
}
28
- let new_result = ( total_speed + new_speed - lowest_speed) * efficiencies[ i] ;
29
- if new_result < result {
30
- continue ;
31
- }
30
+ total_speed += new_speed - lowest_speed;
31
+ result = result. max ( total_speed * efficiencies[ i] ) ;
32
32
speed_queue. pop ( ) ;
33
33
speed_queue. push ( Reverse ( new_speed) ) ;
34
- result = new_result;
35
34
}
36
- result
35
+ ( result % 1000000007 ) as i32
37
36
}
38
37
}
39
38
0 commit comments