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

दुश्मन को हराने के लिए आवश्यक न्यूनतम ऑपरेशन्स की संख्या ज्ञात करने का C++ प्रोग्राम


मान लीजिए हम एक वीडियो गेम खेल रहे हैं जहाँ नायक चाकू से दुश्मनों को हराता है। नायक चाकू से दुश्मन पर वार कर सकता है या उसे फेंक सकता है। यदि नायक चाकू फेंकता है, तो उसे वापस नहीं पाया जा सकता। चाकू i द्वारा पहुँचाई गई क्षति 'knives' सरणी में दी गई है जहाँ प्रत्येक तत्व {slash, throw} प्रारूप में है। 'Slash' का अर्थ है उस चाकू से वार करके पहुँचाई गई क्षति और 'throw' का अर्थ है उस चाकू को फेंककर पहुँचाई गई क्षति। वार असीमित बार किया जा सकता है, लेकिन एक चाकू केवल एक बार फेंका जा सकता है। अब एक दुश्मन प्रकट होता है जिसका स्वास्थ्य h है। हमें दुश्मन को हराने के लिए आवश्यक न्यूनतम ऑपरेशन्स (वार या फेंक) की संख्या ज्ञात करनी है। दुश्मन तब हारता है जब उसका स्वास्थ्य 0 हो जाता है।

उदाहरण के लिए, यदि इनपुट है n = 2, h = 11, knives = {{4, 5}, {3, 6}}, तो आउटपुट 2 होगा।

यदि नायक दोनों चाकू फेंकता है, तो पहुँचाई गई क्षति 5 + 6 = 11 होगी। दुश्मन का स्वास्थ्य 0 हो जाता है, इसलिए वह हार जाता है।

चरण

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

val := 0
i := 0 से n-1 तक:
    val := max(val, knives[i] का पहला मान)
knives सरणी को सॉर्ट करें
res := 0
i := 0 से n-1 तक:
    यदि knives[i] का दूसरा मान > val, तो:
        h := h - knives[i] का दूसरा मान
        res बढ़ाएँ
        यदि h <= 0, तो:
            res प्रिंट करें
            बाहर निकलें
    अन्यथा:
        लूप से बाहर निकलें
res + ceil(h / (double)val) प्रिंट करें

उदाहरण

बेहतर समझ के लिए निम्न कार्यान्वयन देखें:

#include <bits/stdc++.h> using namespace std; void solve(int n, int h, vector<pair<int, int>> knives){    int val = 0;    for(int i = 0; i < n; i++){       val = max(val, knives[i].first);    }    sort(knives.begin(), knives.end());    int res = 0;    for(int i = 0; i < n; i++){       if(knives[i].second > val){          h -= knives[i].second;          res++;          if(h <= 0){             cout << res << endl;             return;          }       }       else break; } cout << (res + ceil(h / (double)val)) << endl; } int main() { int n = 2, h = 11; vector<pair<int, int>> knives = {{4, 5}, {3, 6}}; solve(n, h, knives); return 0; }

इनपुट

2, 11, {{4, 5}, {3, 6}}

आउटपुट

2
  1. ग्रिड में रोशन सेल्स की संख्या ज्ञात करने का C++ प्रोग्राम ग्रिड में रोशन सेल्स की संख्या ज्ञात करने का C++ प्रोग्राम

    मान लीजिए h × w आयाम का एक ग्रिड दिया गया है। ग्रिड की सेल्स में बल्ब या बाधाएँ हो सकती हैं। एक बल्ब सेल स्वयं और अपने दाएँ, बाएँ, ऊपर, नीचे की सेल्स को रोशन करता है। प्रकाश सेल्स के माध्यम से चमकता है जब तक कि कोई बाधा सेल इसे न रोक दे। बाधा सेल न तो रोशन हो सकती है और न ही प्रकाश को गुजरने देती ह

  1. ग्रिड में पथ बनाने के लिए ब्लॉक की जाने वाली सेल्स की संख्या ज्ञात करने का C++ प्रोग्राम ग्रिड में पथ बनाने के लिए ब्लॉक की जाने वाली सेल्स की संख्या ज्ञात करने का C++ प्रोग्राम

    मान लीजिए h × w आयाम का एक ग्रिड है। रोबोट सेल (0, 0) पर है और उसे (h-1, w-1) तक पहुँचना है। ग्रिड में दो प्रकार की सेल्स हैं: ब्लॉक और अनब्लॉक। रोबोट अनब्लॉक सेल्स से गुजर सकता है लेकिन ब्लॉक सेल्स से नहीं। रोबोट चार दिशाओं में जा सकता है: बाएँ, दाएँ, ऊपर, नीचे। लेकिन रोबोट किसी सेल से दूसरी सेल म

  1. C++ में प्रतिद्वंद्वी को पकड़ने के लिए आवश्यक न्यूनतम चरणों की संख्या ढूंढने का प्रोग्राम C++ में प्रतिद्वंद्वी को पकड़ने के लिए आवश्यक न्यूनतम चरणों की संख्या ढूंढने का प्रोग्राम

    परिचय मान लीजिए हमारे पास ट्री एजेज की एक सूची है [u, v] के रूप में, जो इंगित करती है कि u और v के बीच एक अनडायरेक्टेड एज है। और हमारे पास दो मान x और y भी हैं। यदि हम नोड x पर हैं, और हमारा प्रतिद्वंद्वी नोड y पर है। पहले राउंड में हम चलते हैं, फिर अगले राउंड में प्रतिद्वंद्वी चलता है और इसी तरह।