가격 배열이 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 |라운드_{i} (???? ) - ????$
따라서 입력이 ["0.700", "2.800", "4.900"]이고 목표가 8인 경우 바닥 또는 천장 연산을 사용하여 (0.7 - 0) + (3 - 2.8) + (5 - 4.9) =0.7 + 0.2 + 0.1 =1.0
이 문제를 해결하기 위해 다음 단계를 따릅니다. −
-
ret :=0
-
(이중 및 배열) 유형의 복합 데이터에 대해 하나의 우선 순위 큐 pq를 만듭니다.
-
범위 0에서 가격 크기까지의 i에 대해
-
x :=가격의 두 배 값[i]
-
낮음 :=x의 바닥
-
높음 :=x의 상한
-
낮음이 높지 않은 경우
-
diff :=(높음 - x) – (x - 낮음)
-
pq에 diff 삽입
-
-
대상 :=대상 – 낮음
-
ret :=ret + (x - 낮음)
-
-
target> size of pq 또는 target <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"