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

C++ का उपयोग करके सीढ़ी चरणों की संख्या खोजना

समस्या विवरण

इस समस्या में, हमें एक संख्या N दी गई है जो सीढ़ी बनाने के लिए प्रदान की गई ईंटों की संख्या को दर्शाती है। हमारा कार्य सीढ़ी चरणों की संख्या खोजना है।

दी गई ईंटों का उपयोग करके, हमें एक सीढ़ी चरण बनाने की आवश्यकता है। प्रत्येक चरण पिछले चरण से एक अधिक ईंट लेता है। और पहला चरण दो ईंट ऊंचा है। हमें ऐसी चरणों की संख्या खोजने की आवश्यकता है जो ईंटों से बनाई जा सकती हैं।

उदाहरण

इनपुट

N = 40

आउटपुट

3

व्याख्या: चरण 1: 2 ईंट, चरण 2: 3 ईंट, चरण 3: 4 ईंट, कुल = 9 ईंट। चरण 4 के लिए 5 ईंट चाहिए, कुल 14। चरण 5: 6 ईंट, कुल 20। चरण 6: 7 ईंट, कुल 27। चरण 7: 8 ईंट, कुल 35। चरण 8 के लिए 9 ईंट चाहिए लेकिन केवल 5 बची हैं। इसलिए 3 चरण बनाए जा सकते हैं (समस्या कथन के उदाहरण में 3 दिखाया गया है लेकिन गणना 7 दिखाती है - आइए सही गणना करें)।

सही गणना

चरण i के लिए i+1 ईंट की आवश्यकता होती है (चरण 1 = 2 ईंट, चरण 2 = 3 ईंट, ...)।

k चरणों के लिए कुल ईंट = 2 + 3 + ... + (k+1) = (k+1)(k+2)/2 - 1 = k(k+3)/2

हमें अधिकतम k चाहिए जैसे कि k(k+3)/2 ≤ N

हल का दृष्टिकोण

समस्या का एक सरल समाधान लूप का उपयोग करना है, 2 से शुरू करके जब तक उपयोग की गई ईंटों की संख्या N से अधिक न हो जाए और फिर अंतिम चरण की गिनती वापस करें।

यह समाधान अच्छा है लेकिन समय जटिलता N क्रम की है। और द्विआधारी खोज का उपयोग करके योग सूत्र से समाधान खोजने का एक बेहतर दृष्टिकोण बनाया जा सकता है।

C++ कार्यान्वयन (बाइनरी खोज)

#include <iostream> 
using namespace std; 

int findStairCount(int T) {
    int low = 1;
    int high = T / 2;
    
    while (low <= high) {
        int mid = (low + high) / 2;
        // k चरणों के लिए आवश्यक ईंट = k(k+3)/2
        // हम T = 2N के साथ जांचते हैं
        long long needed = 1LL * mid * (mid + 1);
        if (needed == T)
            return mid;
        if (mid > 0 && needed > T && 1LL * mid * (mid - 1) <= T)
            return mid - 1;
        if (needed > T)
            high = mid - 1;
        else
            low = mid + 1;
    }
    return -1;
}

int main() {
    int N = 60;
    int stepCount = findStairCount(2 * N);
    if (stepCount != -1)
        stepCount--;
    cout << "बनाए जा सकने वाले सीढ़ी चरणों की संख्या है " << stepCount;
    return 0;
}

आउटपुट

बनाए जा सकने वाले सीढ़ी चरणों की संख्या है 9

सरल O(√N) दृष्टिकोण

int steps = 0;
int bricksUsed = 0;
for (int i = 2; bricksUsed + i <= N; i++) {
    bricksUsed += i;
    steps++;
}
return steps;

जटिलता विश्लेषण

  • बाइनरी खोज: O(log N) समय, O(1) स्पेस
  • सरल लूप: O(√N) समय, O(1) स्पेस
  1. C++ में स्ट्रिंग के सबस्ट्रिंग्स की संख्या निकालना C++ में स्ट्रिंग के सबस्ट्रिंग्स की संख्या निकालना

    इस लेख में, आप एक दी गई स्ट्रिंग में बनने वाले सबस्ट्रिंग्स (गैर-खाली) की संख्या निकालने के दृष्टिकोण के बारे में जानेंगे।इनपुट: string = moon आउटपुट: 10 व्याख्या: सबस्ट्रिंग्स हैं m, o, o, n, mo, oo, on, moo, oon और moon। इनपुट: string = yellow आउटपुट: 21समाधान खोजने का दृष्टिकोणमान लें स्ट्रिंग की

  1. C++ का उपयोग करके स्टॉपिंग स्टेशनों की संख्या ज्ञात करें C++ का उपयोग करके स्टॉपिंग स्टेशनों की संख्या ज्ञात करें

    बिंदु X और Y के बीच n संख्या में इंटरमीडिएट ट्रेन स्टेशन हैं। उन विभिन्न तरीकों की गणना करें जिनसे ट्रेनों को s स्टेशनों पर रुकने के लिए व्यवस्थित किया जा सकता है जैसे कि कोई दो स्टेशन एक-दूसरे के बगल में न हों। तो इस लेख में, हम स्टॉपिंग स्टेशनों की संख्या ज्ञात करने के लिए हर संभव दृष्टिकोण की व्य

  1. C++ का उपयोग करके एक सेट पर रिफ्लेक्सिव रिलेशंस की संख्या ज्ञात करें C++ का उपयोग करके एक सेट पर रिफ्लेक्सिव रिलेशंस की संख्या ज्ञात करें

    इस लेख में, हम एक सेट पर रिफ्लेक्सिव रिलेशंस की संख्या ज्ञात करने के दृष्टिकोणों की व्याख्या करेंगे। इस समस्या में, हमें संख्या n दी गई है, और n प्राकृतिक संख्याओं के एक सेट पर, हमें रिफ्लेक्सिव रिलेशंस की संख्या निर्धारित करनी है।रिफ्लेक्सिव रिलेशन - एक सेट A में एक रिलेशन को रिफ्लेक्सिव कहा जाता ह