rustgym/leetcode/
_1058_minimize_rounding_error_to_meet_target.rs

1struct 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}