假设我们有一个价格数组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"