Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> C++

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 है। फ्लोर या सील ऑपरेशन का उपयोग करके (0.7 - 0) + (3 - 2.8) + (5 - 4.9) = 0.7 + 0.2 + 0.1 = 1.0 प्राप्त करें।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे:

  • ret := 0

  • (डबल और सरणी) प्रकार के जटिल डेटा के लिए एक प्रायोरिटी क्यू pq बनाएं

  • i को 0 से कीमतों के आकार तक रेंज में लिए:

    • x := कीमतों[i] का डबल मान

    • low := x का फ्लोर

    • high := x का सीलिंग

    • यदि low, high नहीं है

      • diff := (high - x) - (x - low)

      • diff को pq में डालें

    • target := target - low

    • ret := ret + (x - low)

  • यदि target > pq का आकार या target < 0, तो "-1" लौटाएं

  • जब तक target 0 नहीं है:

    • ret := ret + pq का टॉप, pq से हटाएं

    • d
    • target को 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"

  1. - C++ कोड: लक्ष्य x प्राप्त करने के लिए डाइस रोल की संख्या गिनें

    मान लीजिए हमारे पास एक संख्या x है। हमारे पास एक छह-फलक वाला डाइस है और इसके फलक 2 से 7 तक क्रमांकित हैं। हम डाइस से ठीक x अंक चाहते हैं। जब हम डाइस फेंकते हैं तो फलक की संख्या हमारे लक्ष्य तक पहुंचने के लिए जुड़ जाएगी। हमें वास्तव में डाइस रोल की संख्या की परवाह नहीं है, इसलिए हम सिर्फ यह जानना चाह

  1. क्लोजेस्ट बाइनरी सर्च ट्री वैल्यू II - C++ क्लोजेस्ट बाइनरी सर्च ट्री वैल्यू II - C++

    मान लीजिए हमारे पास एक बाइनरी सर्च ट्री और एक लक्ष्य मान है; हमें उस BST में k मान ढूंढने हैं जो लक्ष्य के सबसे करीब हैं। हमें ध्यान रखना होगा कि लक्ष्य मान एक फ्लोटिंग-पॉइंट संख्या है। हम मान सकते हैं कि k हमेशा वैध है, और k ≤ कुल नोड्स।तो, यदि इनपुट इस तरह हैtarget = 3.714286, और k = 2, तो आउटप

  1. विंडोज 10 पर C++ रनटाइम एरर हल करें - त्वरित और विश्वसनीय समाधान विंडोज 10 पर C++ रनटाइम एरर हल करें - त्वरित और विश्वसनीय समाधान

    कई विंडोज उपयोगकर्ता पीसी को रीस्टार्ट करने पर माइक्रोसॉफ्ट विजुअल C++ रनटाइम लाइब्रेरी विंडो में रनटाइम एरर C++ का सामना करते हैं। उन्होंने अपने कंप्यूटर पर माइक्रोसॉफ्ट एक्सप्लोरर लॉन्च करने के बाद भी इस एरर का अनुभव किया। यह उपयोगकर्ताओं के लिए चौंकाने वाला हो सकता है क्योंकि वे कंप्यूटर रीबूट कर