কম্পিউটার

C++ এ লক্ষ্য পূরণের জন্য রাউন্ডিং ত্রুটি কম করুন


ধরুন আমাদের মূল্যের একটি বিন্যাস রয়েছে P [p1,p2...,pn] এবং একটি লক্ষ্য মান, আমাদের প্রতিটি মূল্য Pi থেকে রাউন্ডি(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 হয়। (0.7 - 0) + (3 - 2.8) + (5 - 4.9) পেতে ফ্লোর বা সিল অপারেশন ব্যবহার করুন। =0.7 + 0.2 + 0.1 =1.0

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • ret :=0

  • (ডাবল এবং অ্যারে) টাইপ জটিল ডেটা

    এর জন্য একটি অগ্রাধিকার সারি pq তৈরি করুন
  • আমার জন্য 0 থেকে দামের আকারের মধ্যে

    • x :=দামের দ্বিগুণ মান[i]

    • নিম্ন :=x এর তল

    • উচ্চ :=x এর সিলিং

    • কম হলে বেশি না হয়

      • পার্থক্য :=(উচ্চ - x) - (x - নিম্ন)

      • pq

        -এ পার্থক্য সন্নিবেশ করান
    • লক্ষ্য :=লক্ষ্য – কম

    • ret :=ret + (x - low)

  • যদি লক্ষ্য> pq এর আকার বা লক্ষ্য <0 হয়, তাহলে “-1”

    রিটার্ন করুন
  • যখন লক্ষ্য 0

    নয়
    • ret :=ret + pq এর শীর্ষ, pq থেকে মুছুন

    • d
    • লক্ষ্য হ্রাস করুন 1

  • s :=স্ট্রিং হিসাবে ret করুন

  • তিন দশমিক স্থান পর্যন্ত সংখ্যা নিয়ে সাবস্ট্রিংগুলি ফেরত দিন

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

উদাহরণ

#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"

  1. ফড়িং লক্ষ্যে পৌঁছাতে পারে কি না তা পরীক্ষা করতে C++ কোড

  2. টার্গেট x পেতে ডাইস রোলের সংখ্যা গণনা করতে C++ কোড

  3. C++-এ নিকটতম বাইনারি অনুসন্ধান ট্রি মান II

  4. Windows 10 এ রানটাইম ত্রুটি C++ ঠিক করুন