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

C++ में थ्रेसहोल्ड से कम या उसके बराबर योग वाले वर्ग की अधिकतम पार्श्व लंबाई


मान लीजिए कि हमारे पास एक m x n मैट्रिक्स मैट और एक पूर्णांक थ्रेशोल्ड है। हमें दिए गए थ्रेशोल्ड से कम या उसके बराबर योग के साथ एक वर्ग की अधिकतम साइड-लम्बाई है या यदि ऐसा कोई वर्ग नहीं है तो 0 लौटाएं। तो अगर इनपुट की तरह है -

1 1 3 2 4 3 2
1 1 3 2 4 3 2
1 1 3 2 4 3 2


1 1 3 2 4 3 2
1 1 3 2 4 3 2
1 1 3 2 4 3 2

और थ्रेशोल्ड 4 है, तो आउटपुट 2 होगा, क्योंकि साइड लेंथ 2 के दो वर्ग हैं, इसलिए अधिकतम 2 है

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

  • ठीक नामक एक विधि को परिभाषित करें, इसमें x और मैट्रिक्स m और थ्रेशोल्ड वें लगेंगे
  • सेट करें:=0
  • i के लिए x - 1 से लेकर चटाई की पंक्तियों की संख्या - 1
      . तक
    • सी के लिए x - 1 से लेकर चटाई के कोल्स की संख्या - 1
      • curr:=mat[r, c]
      • अगर c – x>=0, तो curr को mat[r, c – x]
      • . से घटाएं
      • अगर r – x>=0, तो curr को mat[r - x, c]
      • से घटाएं
      • यदि c – x>=0 और r – x>=0, तो curr को mat[r – x, c-x] द्वारा बढ़ाएँ
      • अगर curr <=th, तो true वापिस करें
  • झूठी वापसी
  • मुख्य विधि में, यह मैट्रिक्स और थ्रेशोल्ड लेगा
  • r :=पंक्तियों की संख्या, c :=स्तंभों की संख्या, निम्न :=1, उच्च :=r और c की न्यूनतम, उत्तर :=0
  • i के लिए 1 से c - 1 की सीमा में
    • जे के लिए 0 से सी - 1 की सीमा में
      • चटाई बढ़ाएं[j, i] चटाई द्वारा[j, i - 1]
  • i के लिए 1 से r - 1 की सीमा में
    • जे के लिए 0 से सी - 1 की सीमा में
      • चटाई बढ़ाएं[j, i] चटाई से[i-1,j]
  • कम <=उच्च:
    • मध्य :=निम्न + (उच्च-निम्न)/2
    • यदि (मध्य, चटाई, वें), तो उत्तर:=मध्य और निम्न:=मध्य + 1, अन्यथा उच्च:=मध्य - 1
  • वापसी उत्तर

उदाहरण(C++)

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

#include <bits/stdc++.h>
using namespace std;
typedef long long int lli;
class Solution {
public:
   bool ok(int x, vector < vector<int> >& mat, int th){
      lli current = 0;
      for(int r = x - 1; r < mat.size(); r++){
         for(int c = x - 1; c < mat[0].size(); c++){
            current = mat[r][c];
            if(c - x >= 0)current -= mat[r][c-x];
            if(r -x >= 0)current -= mat[r - x][c];
            if(c - x >= 0 && r - x >= 0)current += mat[r-x][c-x];
            if(current <= th)return true;
         }
      }
      return false;
   }
   int maxSideLength(vector<vector<int>>& mat, int th) {
      int r = mat.size();
      int c = mat[0].size();
      int low = 1;
      int high = min(r, c);
      int ans = 0;
      for(int i = 1; i < c; i++){
         for(int j = 0; j < r; j++){
            mat[j][i] += mat[j][i - 1];
         }
      }
      for(int i = 1; i < r; i++){
         for(int j = 0; j < c; j++){
            mat[i][j] += mat[i - 1][j];
         }
      }
      while(low <= high){
         int mid = low + ( high - low ) / 2;
         if(ok(mid, mat, th)){
            ans = mid;
            low = mid + 1;
         }
         else{
            high = mid - 1;
         }
      }
      return ans;
   }
};
main(){
   vector<vector<int>> v = {{1,1,3,2,4,3,2},{1,1,3,2,4,3,2},{1,1,3,2,4,3,2}};
   Solution ob;
   cout << (ob.maxSideLength(v, 4));
}

इनपुट

[[1,1,3,2,4,3,2],[1,1,3,2,4,3,2],[1,1,3,2,4,3,2]]
4

आउटपुट

2

  1. न्यूनतम संख्याएं जो N से छोटी या उसके बराबर हों और C++ में योग S के साथ हों

    समस्या कथन 1 से N और एक संख्या S से N नंबर दिए गए हैं। कार्य S को देने के लिए योग की न्यूनतम संख्या को प्रिंट करना है उदाहरण यदि n =7 और s =10 तो न्यूनतम 2 संख्याएँ आवश्यक हैं (9, 1) (8, 2) (7, 3) (6, 4) एल्गोरिदम Answer can be calculated using below formula (S/N) + 1 if { S %N > 0} उदाहरण #inc

  1. C++ में N से कम या उसके बराबर संख्याओं के बीच अंकों का अधिकतम गुणनफल ज्ञात कीजिए

    0 है। कार्य N से कम या उसके बराबर संख्याओं के बीच अंकों का अधिकतम गुणनफल खोजना है। यदि N 390 है, तो परिणाम है 216, क्योंकि संख्या 389 अधिकतम उत्पाद 3 * 8 * 9 =216 बना रही है। इस समस्या को हल करने के लिए, हम पुनरावर्ती दृष्टिकोण का उपयोग करेंगे। इसलिए यदि N =0 है, तो 1 लौटाएँ, यदि संख्या N <10 है, त

  1. सी ++ में उत्पाद के बराबर एलसीएम के साथ अधिकतम लंबाई उपसरणी

    मान लीजिए कि हमारे पास एक सरणी A है। हमें उप-सरणी की अधिकतम लंबाई ज्ञात करनी है, जिसका LCM उस उप-सरणी के तत्वों के गुणनफल के समान है। यदि उस प्रकार का उप-सरणी नहीं मिलता है, तो -1 लौटाएं। मान लीजिए सरणी {6, 10, 21} है, तो लंबाई 2 है, क्योंकि उप-सरणी {10, 21} है, जिसका एलसीएम 210 है, और उत्पाद भी 210