কম্পিউটার টিউটোরিয়াল

C++-এ ৪৫ ডিগ্রি রেখা দিয়ে সমতলকে সমান ওজন ভাগ করা যায় কিনা তা যাচাই করুন


মান লিজিয়ে nটি আলাদা পয়েন্ট (Xi, Yi) ২D কোঅর্ডিনেটে আছে এবং প্রতিটি পয়েন্টের ওজন Wi। আমাদের যাচাই করতে হবে ৪৫ ডিগ্রির একটি রেখা আঁকা যায় কিনা যাতে রেখার দুপাশের পয়েন্টগুলোর ওজন যোগফল সমান হয়।

ইনপুট: [[-1,1,3],[-2,1,1],[1,-1,4]] হলে আউটপুট: True

সমাধানের ধাপগুলো:

  • n := v.size()
  • weight_at_x ম্যাপ সংজ্ঞায়িত করুন
  • max_x := -2000, min_x := 2000
  • i=0 থেকে n-1 পর্যন্ত: temp_x = v[0][i] - v[1][i], max_x/min_x আপডেট করুন, weight_at_x[temp_x] += v[2][i]
  • sum_temp অ্যারে তৈরি করুন, ০ পুশ করুন
  • x=min_x থেকে max_x পর্যন্ত: sum_temp-এ sum_temp.back() + weight_at_x[x] পুশ করুন
  • total_sum := sum_temp.back()
  • partition_possible := false
  • i=1 থেকে sum_temp.size()-1 পর্যন্ত: যদি sum_temp[i] == total_sum - sum_temp[i] বা sum_temp[i-1] == total_sum - sum_temp[i], partition_possible = true
  • partition_possible রিটার্ন করুন

উদাহরণ

নিচের ইমপ্লিমেন্টেশন দেখুন:

#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++-এ একটি রেখা বৃত্তকে স্পর্শ করে কিনা বা ইন্টারসেক্ট করে কিনা চেক করা

  2. C++-এ একটি সংখ্যা দুটি অবানড্যান্ট নম্বরের যোগফল হিসেবে প্রকাশ করা যায় কিনা তা যাচাই করা

  3. C++-এ অ্যারেকে সমান সম বিন্যাসে ভাগ করা দেওয়া শর্ত অনুযায়ী

  4. C++ প্রোগ্রাম: রেখা অরিজিন (0,0) দিয়ে গিয়ে কিনা চেক