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

C++-এ একটি গেমে শূন্য বা ঋণাত্মক হতে পারা সংখ্যাগুলোর সংখ্যা গণনা


একটি ধনাত্মক সংখ্যার অ্যারে এবং দুটি ইন্টিজার A এবং B দেওয়া আছে। দুই খেলাড় একটি গেম খেলছে যাতে তারা অ্যারেতে থাকা সংখ্যাগুলো কমাবে। খেলাড় ১ যেকোনো এলিমেন্টকে A দিয়ে কমাতে পারবে এবং খেলাড় ২ যেকোনো এলিমেন্টকে B দিয়ে বাড়াতে পারবে। লক্ষ্য হলো খেলাড় ১ কতগুলো সংখ্যাকে ০ বা ঋণাত্মক করতে পারবে সেটি বের করা। প্রথম মুভ খেলাড় ১ করবে। একবার কোনো সংখ্যা ০ বা ঋণাত্মক হলে সেটি খেলাড় ২ বিবেচনা করবে না।

উদাহরণ ১

ইনপুট

arr[] = { 1,4,5,2 } A=2, B=3

আউটপুট

গেমে শূন্য বা ঋণাত্মক হতে পারা সংখ্যাগুলোর সংখ্যা: 1

ব্যাখ্যা

খেলাড় ১ শুধু ১ কে কমাতে পারবে কারণ প্রথম মুভে সেটি -১ হয়ে যাবে। বাকিগুলো খেলাড় ২ বাড়িয়ে A-র চেয়ে বড় করে দেবে।

উদাহরণ ২

ইনপুট

arr[] = { 1,4,5,2 } A=4, B=4

আউটপুট

গেমে শূন্য বা ঋণাত্মক হতে পারা সংখ্যাগুলোর সংখ্যা: 2

ব্যাখ্যা

প্রথম মুভে খেলাড় ১, ৪ কে ০ করবে। arr[] = [1, 0, 5, 2]। খেলাড় ২, ১ কে ৪ করবে। arr[] = [5, 0, 5, 2]। খেলাড় ১, ২ কে -২ করবে। arr[] = [5, 0, 5, -2]। এখন সব সংখ্যা A-র চেয়ে বড় তাই খেলাড় ১ আর কমাতে পারবে না।

প্রয়োগ করা পদ্ধতি

এই পদ্ধতিতে প্রথমে চেক করা হয় A > B কিনা। যদি হয়, তবে N মুভে A সকল N এলিমেন্টকে ০ বা ঋণাত্মক করবে। যদি A <= B হয়, তবে চেক করা হয়:

  • সকল সংখ্যা যারা খেলাড় ২ B যোগ করলেও A-র চেয়ে বড় হয় না। এটিকে C1 ধরি।

  • সকল সংখ্যা যারা A-র চেয়ে ছোট কিন্তু খেলাড় ২ B যোগ করলে A-র চেয়ে বড় হয়ে যায়। এটিকে C2 ধরি।

মোট কাউন্ট = C = C1 + (C2+1)/2। কারণ কেস ২-এ শুধু অর্ধেকই ০ বা ঋণাত্মক হবেন যেহেতু দুজন খেলাড়ই একসাথে বাড়া/কমাচ্ছে। এবং খেলাড় ২ শুধু অর্ধেক কে A-র চেয়ে বড় করতে পারবে। এই meioखেলাড় ১ বাকি অর্ধেক কে <=০ করবে।

  • ধনাত্মক সংখ্যার ইন্টিজার অ্যারে নিন।

  • দুটি ভেরিয়েবল A এবং B নিন।

  • reduced_zero(int arr[], int size, int A, int B) ফাংশনটি সংখ্যা রিটার্ন করে।

  • আরম্ভিক কাউন্ট ০ রাখুন।

  • দুটি ভেরিয়েবল temp_1 এবং temp_2 অস্থায়ী কাউন্ট হিসেবে নিন।

  • যদি A > B হয় তবে অ্যারের দৈর্ঘ্য size রিটার্ন করুন।

  • এখন for লুপ দিয়ে অ্যারে ট্রুভার্স করুন, প্রতিটি arr[i] এর জন্য যদি এলিমেন্ট + B < A হয় তবে temp_1 বাড়ান।

  • প্রতিটি এলিমেন্ট arr[i] <= A হলে temp_2 বাড়ান।

  • for লুপ শেষে count = temp_1 + (temp_2+1)/2 ক্যালকুলেট করুন সূত্র অনুযায়ী।

  • কাউন্ট রিটার্ন করুন ফলাফল হিসেবে।

উদাহরণ কোড

#include <bits/stdc++.h> 
using namespace std; 

int reduced_zero(int arr[], int size, int A, int B) {
    int count = 0; 
    int temp_1 = 0, temp_2 = 0; 
    
    if (A > B) {
        return size; 
    } 
    
    for(int i = 0; i < size; i++) {
        if (A >= arr[i] + B) {
            temp_1++; 
        } else if(A >= arr[i]) {
            temp_2++; 
        } 
    } 
    
    int temp = (temp_2 + 1) / 2; 
    count = temp + temp_1; 
    return count; 
} 

int main() { 
    int arr[] = { 3, 3, 1, 2, 4, 7, 1}; 
    int A = 4, B = 1; 
    int size = sizeof(arr) / sizeof(arr[0]); 
    cout << "গেমে শূন্য বা ঋণাত্মক হতে পারা সংখ্যাগুলোর সংখ্যা: " << reduced_zero(arr, size, A, B); 
    return 0; 
}

আউটপুট

উপরোক্ত কোডটি রান করলে নিচের আউটপুটটি আসবে:

গেমে শূন্য বা ঋণাত্মক হতে পারা সংখ্যাগুলোর সংখ্যা: 7

  1. C++-এ অ্যারেতে সর্বোচ্চ সन्नিহিত জোড় সংখ্যা (Contiguous Even Numbers) এর গণনা

  2. সি++ প্রোগ্রাম: সংখ্যা বিভাজ্য করে এমন অঙ্কগুলোর গণনা (Count of Digits Dividing the Number)

  3. C++-এ প্রতিটি সারি থেকে একটি সংখ্যা নির্বাচন করে XOR শূন্য থেকে বড় হয় কিনা চেক করা

  4. সি++-এ যেসব ফাংশন ওভারলোড করা যায় না