Minimize Rounding Error to Meet Target
Given an array of prices[p1,p2...,pn]
and atarget
, round each pricepi
toRoundi(pi)
so that the rounded array[Round1(p1),Round2(p2)...,Roundn(pn)]
sums to the giventarget
. Each operationRoundi(pi)
could be eitherFloor(pi)
orCeil(pi)
.
Return the string"-1"
if the rounded array is impossible to sum totarget
. Otherwise, return the smallest rounding error, which is defined as Σ |Roundi(pi) - (pi)| forifrom 1 ton, as a string with three places after the decimal.
Example 1:
Input:
prices =
["0.700","2.800","4.900"]
, target =
8
Output:
"1.000"
Explanation:
Use Floor, Ceil and Ceil operations to get (0.7 - 0) + (3 - 2.8) + (5 - 4.9) = 0.7 + 0.2 + 0.1 = 1.0 .
Example 2:
Input:
prices =
["1.500","2.500","3.500"]
, target =
10
Output:
"-1"
Explanation:
It is impossible to meet the target.
Note:
1
<
= prices.length
<
= 500
.
Each string of prices
prices[i]
represents a real number which is between 0 and 1000 and has exactly 3 decimal places.
target
is between 0 and 1000000.
分析
int和floor差不多,也是切头,3 = 3.000 True
这里算出max和min,中间差的就是floor或者ceil。 max-target就是多出来的,需要floor的数字。
记住map和filter都要变List
format用法:"{:.3f}".format(res)
from math import ceil,floor
class Solution:
def minimizeError(self, prices: List[str], target: int) -> str:
prices = list(map(float,prices))
lg,sm = int(sum(map(ceil,prices))),sum(map(int,prices))
if not sm<=target<=lg:
return "-1"
m = lg-target
prices = list(filter(lambda x: x!=int(x),prices))
prices.sort(key = lambda x: (x-int(x)))
res = sum(x-int(x) for x in prices[:m]) + sum(ceil(x)-x for x in prices[m:])
return "{:.3f}".format(res)
Last updated
Was this helpful?