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

जांचें कि क्या 45 डिग्री पर एक रेखा विमान को दो बराबर वजन भागों में C++ . में विभाजित कर सकती है

मान लीजिए कि हमारे पास 2D निर्देशांक में n अलग-अलग बिंदु (Xi, Yi) हैं और प्रत्येक बिंदु का वजन Wi है, हमें जांचना है कि क्या 45 डिग्री पर एक रेखा खींची जा सकती है। ताकि दोनों तरफ के बिंदुओं के भार का योग समान हो।

इसलिए, यदि इनपुट [[-1,1,3], [-2,1,1], [1,-1,4]] जैसा है, तो आउटपुट सही होगा/

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

  • n :=v का आकार
  • एक मानचित्र weight_at_x परिभाषित करें
  • max_x:=-2000, min_x:=2000
  • इनिशियलाइज़ i :=0 के लिए, जब i करें
  • temp_x :=v[0, i] - v[1, i]
  • max_x :=max_x और temp_x की अधिकतम
  • min_x :=न्यूनतम min_x और temp_x
  • weight_at_x[temp_x] :=weight_at_x[temp_x] + v[2, i]
  • एक सरणी sum_temp परिभाषित करें
  • sum_temp के अंत में 0 डालें
  • इनिशियलाइज़ x :=min_x के लिए, जब x <=max_x, अपडेट करें (1 से x बढ़ाएँ), करें -
    • sum_temp के अंत में (sum_temp + weight_at_x[x] का अंतिम तत्व) डालें
  • total_sum :=sum_temp का अंतिम तत्व
  • विभाजन_संभव:=असत्य
  • इनिशियलाइज़ i :=1 के लिए, जब i
  • यदि sum_temp[i], total_sum - sum_temp[i] के समान है, तो −
    • विभाजन_संभव:=सत्य
  • यदि sum_temp[i - 1], total_sum - sum_temp[i] के समान है, तो −
    • विभाजन_संभव:=सत्य
  • विभाजन_संभव लौटाएं
  • उदाहरण

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

    #include <bits/stdc++.h>
    using namespace std;
    void is_valid_part(vector<vector<int>> &v){
       int n = v.size();
       map<int, int> weight_at_x;
       int max_x = -2000, min_x = 2000;
       for (int i = 0; i < n; i++) {
          int temp_x = v[0][i] - v[1][i];
          max_x = max(max_x, temp_x);
          min_x = min(min_x, temp_x);
          weight_at_x[temp_x] += v[2][i];
       }
       vector<int> sum_temp;
       sum_temp.push_back(0);
       for (int x = min_x; x <= max_x; x++) {
          sum_temp.push_back(sum_temp.back() + weight_at_x[x]);
       }
       int total_sum = sum_temp.back();
       int partition_possible = false;
       for (int i = 1; i < sum_temp.size(); i++) {
          if (sum_temp[i] == total_sum - sum_temp[i])
             partition_possible = true;
          if (sum_temp[i - 1] == total_sum - sum_temp[i])
             partition_possible = true;
       }
       printf(partition_possible ? "TRUE" : "FALSE");
    }
    int main() {
       vector<vector<int>> v = {{-1,1,3},{-2,1,1},{1,-1,4}};
       is_valid_part(v);
    }

    इनपुट

    {{-1,1,3},{-2,1,1},{1,-1,4}}

    आउटपुट

    TRUE

    1. जाँच करें कि कोई रेखा C++ में वृत्त को स्पर्श करती है या प्रतिच्छेद करती है

      मान लीजिए हमारे पास एक वृत्त और दूसरी सीधी रेखा है। हमारा कार्य यह पता लगाना है कि रेखा वृत्त को स्पर्श करती है या उसे काटती है, अन्यथा वह बाहर से होकर गुजरती है। तो नीचे की तरह तीन अलग-अलग मामले हैं - यहां हम इसे निम्नलिखित चरणों द्वारा हल करेंगे। ये नीचे की तरह हैं - केंद्र के बीच लंबवत P ढूंढ

    1. C++ में दी गई शर्तों के अनुसार सरणी को समान योग भागों में विभाजित करें

      यहां हम एक समस्या देखेंगे। मान लीजिए कि एक सरणी गिरफ्तारी दी गई है। हमें यह जांचना होगा कि क्या सरणी को दो भागों में विभाजित किया जा सकता है, जैसे - दोनों उप-सरणी के उप समान होंगे सभी तत्व, जो 5 के गुणज हैं, एक ही समूह में होंगे सभी तत्व जो 3 के गुणज हैं, लेकिन 5 के गुणज नहीं, एक ही समूह में होंगे

    1. जांचें कि कोई रेखा सी ++ में मूल से गुजरती है या नहीं

      इस भाग में हम यह देखेंगे कि किसी रेखाखंड के मूल बिंदु से होकर गुजरता है या नहीं इसकी जांच कैसे की जाती है। रेखा खंड के अंतिम बिंदुओं को दर्शाने के लिए हमारे पास दो निर्देशांक बिंदु हैं। दृष्टिकोण सरल है। यदि हम सरल रेखा का समीकरण बना सकते हैं, और समीकरण में (0, 0) रखकर, और समीकरण संतुष्ट हो जाता है