最小化舍入误差以达到C ++中的目标
假设我们有一个价格数组P[p1,p2...,pn]和一个目标值,我们必须将每个价格Pi舍入到Roundi(Pi),这样舍入后的数组[Round1(P1),Round2(P2)...,Roundn(Pn)]求和为给定的目标值。在这里,每个操作Roundi(pi)可以是Floor(Pi)或Ceil(Pi)。
如果无法将舍入的数组求和,则必须返回字符串“-1”。否则,返回最小的舍入误差,它将(作为小数点后三位的字符串)定义为-
$\displaystyle\sum\limits_{i-1}^n|Round_{i}(????)-????$
因此,如果输入类似于[“0.700”,“2.800”,“4.900”],并且目标为8。使用下限或ceil运算获得(0.7-0)+(3-2.8)+(5-4.9)=0.7+0.2+0.1=1.0
为了解决这个问题,我们将遵循以下步骤-
ret:=0
为(双精度和数组)类型的复杂数据制作一个优先级队列pq
对于我来说,价格范围是0到
差异:=(高-x)–(x-低)
将diff插入pq
x:=价格的两倍[i]
低:=x的下限
高:=x的上限
如果低不高
目标:=目标–低
ret:=ret+(x-低)
如果目标>pq的大小或目标<0,则返回“-1”
而目标不为0
ret:=ret+pq顶部,从pq删除
d
将目标降低1
s:=ret作为字符串
通过将数字最多保留小数点后三位来返回子字符串s
让我们看下面的实现以更好地理解-
示例
#include <bits/stdc++.h> using namespace std; struct Comparator{ bool operator()(double a, double b) { return !(a < b); } }; class Solution { public: string minimizeError(vector<string>& prices, int target) { double ret = 0; priority_queue < double, vector < double >, Comparator > pq; for(int i = 0; i < prices.size(); i++){ double x = stod(prices[i]); double low = floor(x); double high = ceil(x); if(low != high){ double diff = ((high - x) - (x - low)); pq.push(diff); } target -= low; ret += (x - low); } if(target > pq.size() || target < 0) return "-1"; while(target--){ ret += pq.top(); pq.pop(); } string s = to_string (ret); return s.substr (0, s.find_first_of ('.', 0) + 4); } }; main(){ vector<string> v = {"0.700","2.800","4.900"}; Solution ob; cout << (ob.minimizeError(v, 8)); }
输入值
["0.700","2.800","4.900"] 8
输出结果
"1.000"