rustgym/leetcode/
_1058_minimize_rounding_error_to_meet_target.rs1struct Solution;
2
3impl Solution {
4 fn minimize_error(prices: Vec<String>, target: i32) -> String {
5 let prices: Vec<f64> = prices
6 .into_iter()
7 .map(|x| x.parse::<f64>().unwrap())
8 .collect();
9 let floor: i32 = prices.iter().map(|x| x.floor() as i32).sum();
10 let ceil: i32 = prices.iter().map(|x| x.ceil() as i32).sum();
11 let n = prices.len();
12 if target < floor || target > ceil {
13 return "-1".to_string();
14 }
15 let m = (target - floor) as usize;
16 let mut diff = vec![];
17 for i in 0..n {
18 if prices[i].floor() as i32 != prices[i].ceil() as i32 {
19 diff.push(prices[i].ceil() as f64 - prices[i]);
20 }
21 }
22 let mut sum = 0.0;
23 diff.sort_by(|a, b| a.partial_cmp(&b).unwrap());
24 for i in 0..diff.len() {
25 if i < m {
26 sum += diff[i];
27 } else {
28 sum += 1.0 - diff[i];
29 }
30 }
31
32 format!("{:.3}", sum)
33 }
34}
35
36#[test]
37fn test() {
38 let prices = vec_string!["0.700", "2.800", "4.900"];
39 let target = 8;
40 let res = "1.000".to_string();
41 assert_eq!(Solution::minimize_error(prices, target), res);
42 let prices = vec_string!["1.500", "2.500", "3.500"];
43 let target = 10;
44 let res = "-1".to_string();
45 assert_eq!(Solution::minimize_error(prices, target), res);
46}