Computer >> Máy Tính >  >> Lập trình >> C ++

Giảm thiểu lỗi làm tròn để đạt được mục tiêu trong C ++

Giả sử chúng ta có một mảng giá P [p1, p2 ..., pn] và một giá trị mục tiêu, chúng ta phải làm tròn từng giá Pi thành Roundi (Pi) sao cho mảng được làm tròn [Round1 (P1), Round2 (P2) ..., Roundn (Pn)] tính bằng giá trị mục tiêu đã cho. Ở đây mỗi hoạt động Roundi (pi) có thể là Tầng (Pi) hoặc Ceil (Pi).

Chúng ta phải trả về chuỗi "-1" nếu không thể tính tổng mảng được làm tròn thành mục tiêu. Nếu không, trả về lỗi làm tròn nhỏ nhất, sẽ là (dưới dạng một chuỗi có ba vị trí sau số thập phân) được xác định là -

$ \ displaystyle \ sum \ limit_ {i-1} ^ n | Round_ {i} (????) - ???? $

Vì vậy, nếu đầu vào là [“0,700”, “2,800”, “4,900”] và mục tiêu là 8. Sử dụng các phép toán sàn hoặc ceil để lấy (0,7 - 0) + (3 - 2,8) + (5 - 4,9) =0,7 + 0,2 + 0,1 =1,0

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • ret:=0

  • tạo một hàng đợi ưu tiên pq cho dữ liệu phức tạp kiểu (kép và mảng)

  • cho tôi trong phạm vi từ 0 đến kích thước của giá

    • x:=gấp đôi giá trị của giá [i]

    • thấp:=tầng của x

    • high:=trần của x

    • nếu thấp thì không cao

      • diff:=(cao - x) - (x - thấp)

      • chèn diff vào pq

    • target:=target - low

    • ret:=ret + (x - low)

  • nếu target> kích thước của pq hoặc target <0, thì trả về “-1”

  • trong khi mục tiêu không phải là 0

    • ret:=ret + đầu pq, xóa khỏi pq

    • d
    • giảm mục tiêu xuống 1

  • s:=ret dưới dạng chuỗi

  • trả về chuỗi con bằng cách lấy số có đến ba chữ số thập phân

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

Ví dụ

#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));
}

Đầu vào

["0.700","2.800","4.900"]
8

Đầu ra

"1.000"