1058 最小化舍入误差以满足目标

给定价格数组和目标值,通过向下或向上取整使舍入后的总和达到目标,返回最小舍入误差。若无法达到目标,返回-1。方法包括先向下取整并检查可行性,然后对小数部分降序排序,贪心地选择向上取整以最小化误差。
摘要由CSDN通过智能技术生成

题目描述:
给定一系列价格 [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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值