[2019 力扣杯-全国高校春季编程大赛初赛]3. 最小化舍入误差以满足目标

给定一系列价格 [p1,p2...,pn] 和一个目标 target,将每个价格 pi 舍入为 Roundi(pi) 以使得舍入数组 [Round1(p1),Round2(p2)...,Roundn(pn)] 之和达到给定的目标值 target。每次舍入操作 Roundi(pi) 可以是向下舍 Floor(pi) 也可以是向上入 Ceil(pi)

如果舍入数组之和无论如何都无法达到目标值 target,就返回 -1。否则,以保留到小数点后三位的字符串格式返回最小的舍入误差,其定义为 Σ |Roundi(pi) - (pi)|( i 从 1 到 n )。

示例 1:

输入:prices = ["0.700","2.800","4.900"], target = 8
输出:"1.000"
解释: 
使用 Floor,Ceil 和 Ceil 操作得到 (0.7 - 0) + (3 - 2.8) + (5 - 4.9) = 0.7 + 0.2 + 0.1 = 1.0 。

示例 2:

输入:prices = ["1.500","2.500","3.500"], target = 10
输出:"-1"
解释:
达到目标是不可能的。

提示:

  1. 1 <= prices.length <= 500
  2. 表示价格的每个字符串 prices[i] 都代表一个介于 0 和 1000 之间的实数,并且正好有 3 个小数位。
  3. target 介于 0 和 1000000 之间。

44 ms

 1 class Solution {
 2     func minimizeError(_ prices: [String], _ target: Int) -> String {
 3         var prices:[Double] = prices.map{Double($0)!}
 4         var numMin:Int = 0
 5         var numMax:Int = 0
 6         var arrFloor:[Double] = [Double]()
 7         var arrCeil:[Double] = [Double]()
 8         for price in prices
 9         {
10             let numFloor:Double = floor(price)
11             let numCeil:Double = ceil(price)
12             arrFloor.append(price - numFloor)
13             arrCeil.append(numCeil - price)
14             numMin += Int(numFloor)
15             numMax += Int(numCeil)    
16         }
17         guard target >= numMin && target <= numMax else
18         {
19             return "-1"
20         }
21         let ceilCount:Int = target - numMin
22         let floorCount:Int = prices.count - ceilCount
23         let arrFloorSort:[Double] = arrFloor.sorted(by:<)
24         var res:Double = 0.0
25         for i in 0..<floorCount
26         {
27             res += arrFloorSort[i]
28             let index:Int = arrFloor.index(of:arrFloorSort[i])!
29             arrCeil[index] = 1.0
30         }
31         arrCeil.sort()
32         res +=  [Double](arrCeil[0..<ceilCount]).reduce(0,+)
33         return  String(format:"%.3f",res)
34     }
35 }

猜你喜欢

转载自www.cnblogs.com/strengthen/p/10708605.html