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

C++ में उच्चतम स्कोर के साथ सबसे छोटा रोटेशन (Smallest Rotation with Highest Score)


मान लीजिए हमारे पास एक ऐरे A है, हम इसे K से घुमा सकते हैं ताकि ऐरे A[K], A[K+1], A[K+2], ... A[A.length - 1], A[0], A[1], ..., A[K-1] बन जाए। फिर, कोई भी प्रविष्टि जो अपने इंडेक्स से कम या बराबर है, 1 अंक के लायक है।

तो उदाहरण के लिए, मान लीजिए हमारे पास एक ऐरे [2, 4, 1, 3, 0] है, और हम K = 2 से घुमाते हैं, यह [1, 3, 0, 2, 4] बन जाता है। यह 3 अंक के लायक है क्योंकि 1 > 0 [कोई अंक नहीं], 3 > 1 [कोई अंक नहीं], 0 <= 2 [एक अंक प्राप्त], 2 <= 3 [एक अंक प्राप्त], 4 <= 4 [एक अंक प्राप्त]।

हमें वह K ज्ञात करना है जिसके लिए हमें उच्चतम स्कोर मिलेगा। यदि कई उत्तर हैं, तो सबसे छोटा ऐसा इंडेक्स K वापस करें। तो, यदि इनपुट K = 2 जैसा है, तो उत्तर 5 होगा।

तो यदि इनपुट [2,3,1,5,1] जैसा है, तो आउटपुट 3 होगा, क्योंकि -

Kऐरेस्कोर
0[2,3,1,5,1]2
1[3,1,5,1,2]3
2[1,5,1,2,4]3
3[5,1,2,4,1]4
4[1,2,4,1,3]3

उत्तर 3 होगा।

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

  • ret := 0
  • n := A का आकार
  • आकार n का एक ऐरे cnt परिभाषित करें
  • i := 0 से प्रारंभ करें, जब i < n, i बढ़ाते हुए, करें -
    • यदि A[i] <= i, तो -
      • minI := 0, (cnt[minI] को 1 से बढ़ाएं)
      • maxI := i - A[i]
      • यदि maxI + 1 < n, तो -
        • cnt[maxI + 1] को 1 से घटाएं
      • यदि i + 1 < n, तो -
        • cnt[i + 1] को 1 से बढ़ाएं
    • अन्यथा
      • यदि A[i] >= n, तो -
        • अगले भाग को अनदेखा करें, अगले पुनरावृत्ति पर जाएं
      • minI := i + 1
      • (cnt[minI] को 1 से बढ़ाएं)
      • maxi := i + (n - A[i])
      • यदि maxi + 1 < n, तो -
        • cnt[maxi + 1] को 1 से घटाएं
  • maxCnt := -1, temp := 0
  • i := 0 से प्रारंभ करें, जब i < n, i बढ़ाते हुए, करें -
    • temp := temp + cnt[i]
    • यदि temp > maxCnt, तो -
      • maxCnt := temp
      • ret := i
  • ret वापस करें

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

उदाहरण

#include <bits/stdc++.h> using namespace std; class Solution { public:    int bestRotation(vector<int>& A) {       int ret = 0;       int n = A.size();       vector <int> cnt(n);       for(int i = 0; i < n; i++){          if(A[i] <= i){             int minI = 0;             cnt[minI]++;             int maxI = i - A[i];             if(maxI + 1 < n) cnt[maxI + 1]--;             if(i + 1 < n) cnt[i + 1]++;          }else{             if(A[i] >= n) continue;             int minI = i + 1;             cnt[minI]++;             int maxi = i + (n - A[i]);             if(maxi + 1 < n)cnt[maxi + 1]--;          }       }       int maxCnt = -1;       int temp = 0;       for(int i = 0; i < n; i++){          temp += cnt[i];          if(temp > maxCnt){             maxCnt = temp;             ret = i;          }       }       return ret;    } }; main(){    Solution ob;    vector<int> v = {2,3,1,5,1};    cout << (ob.bestRotation(v)); }

इनपुट

[2,3,1,5,1]

आउटपुट

3

  1. C++ में एक बिंदु को दूसरे बिंदु के बारे में घुमाना C++ में एक बिंदु को दूसरे बिंदु के बारे में घुमाना

    मूल बिंदु के बारे में कोण θ पर वामावर्त दिशा में बिंदु X का घुमाव निम्न द्वारा किया जाता है -  X को θ से मूल बिंदु के बारे में वामावर्त घुमाएं: X*polar( 1.0,θ )। यहां, जटिल संख्याओं के लिए polar फ़ंक्शन हेडर फ़ाइल के तहत परिभाषित है और चरण कोण और परिमाण का उपयोग करके एक जटिल संख्या खोजने के ल

  1. C++ में 3n स्लाइस वाली पिज्जा C++ में 3n स्लाइस वाली पिज्जा

    समस्या विवरण मान लीजिए 3n स्लाइस वाली एक पिज्जा है जिसके स्लाइस विभिन्न आकार के हैं। मैं और मेरे दो दोस्त पिज्जा के स्लाइस निम्नानुसार लेंगे: मैं कोई भी पिज्जा स्लाइस चुनूंगा। मेरा दोस्त अमल मेरे चुने हुए स्लाइस के एंटी-क्लॉकवाइज दिशा में अगला स्लाइस लेगा। मेरा दोस्त बिमल मेरे चुने हुए स्लाइस के क

  1. C++ में सभी सबसे गहरे नोड्स वाला सबसे छोटा सबट्री C++ में सभी सबसे गहरे नोड्स वाला सबसे छोटा सबट्री

    मान लीजिए हमारे पास रूट पर रूटेड एक बाइनरी ट्री है, प्रत्येक नोड की गहराई रूट से सबसे छोटी दूरी है। यहां एक नोड सबसे गहरा है यदि इसकी गहराई पूरे ट्री में किसी भी नोड के बीच सबसे बड़ी संभव है। एक नोड का सबट्री वह नोड है, साथ ही उस नोड के सभी वंशजों का सेट। हमें सबसे बड़ी गहराई वाला नोड ढूंढना है जैसे