题目描述:
给定一系列价格 [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 <= prices.length <= 500
表示价格的每个字符串 prices[i] 都代表一个介于 0 和 1000 之间的实数,并且正好有 3 个小数位。
target 介于 0 和 1000000 之间。
方法1:
主要思路:
(1)先对数字进行向下取整,并从target中减去对应的数字,然后将字符串后三位字符转成对应的数字,若非零,则进行保存;
(2)判断target是否小于0,若小于0,说明全部向下取整也不能获得需要的数字,返回-1,判断target是否大于nums.size(),若大于,说明即使全部向上取整,也达不到需要的数字,返回-1;
(3)若在两者之间,说明可以通过向上或向下取整获得;
(4)则对获得的小数点后的数字进行降序排序,然后在遍历该降序数组的同时,判断target是否大于0,若大于,则需要将该降序数组当前数字相当于向上取整,这样相当于是在用贪心的思想,将舍入误差尽量的最小化;
class Solution {
public:
string minimizeError(vector<string>& prices, int target) {
vector