কম্পিউটার

সি-তে দুই ধাপে সর্বোচ্চ টাকা তোলা যায়


আমাদের দুটি লকার দেওয়া হয়েছে, যেমন L1 এবং L2 যাতে কয়েন আকারে কিছু পরিমাণ টাকা থাকে৷ L1-এ A কয়েন আছে এবং L2-এ B নম্বর কয়েন আছে। আমাদের লকার থেকে টাকা বা কয়েন তুলতে হবে যাতে বের করা টাকা সর্বাধিক হয়। যেকোন লকার থেকে যতবার কয়েন তোলা হয়, তার আগের কাউন্টের থেকে 1 কম কয়েন দ্বারা প্রতিস্থাপিত হয়। যদি আমরা L1 থেকে A কয়েন আঁকি তাহলে এটি A-1 কয়েন দ্বারা প্রতিস্থাপিত হবে এবং যদি আমরা L2 থেকে B কয়েন আঁকি তাহলে এটি B-1 কয়েন দ্বারা প্রতিস্থাপিত হবে। কাজটি হল দুটি ধাপে উত্তোলিত অর্থের পরিমাণ সর্বাধিক করা। তার মানে কয়েন মাত্র দুবার তোলা যাবে।

ইনপুট৷ − L1 - 10, L2 - 11

আউটপুট −সর্বাধিক অর্থ যা দুটি ধাপে তোলা যাবে − 21

ব্যাখ্যা − ধাপ 1 এ আমরা L2 থেকে 11টি কয়েন প্রত্যাহার করি, L2 11-1=10 কয়েন দ্বারা প্রতিস্থাপিত হবে।

ধাপ 2-এ L1 এবং L2 উভয়েরই 10টি কয়েন রয়েছে তাই যে কোনওটি থেকে প্রত্যাহার করা যেতে পারে এবং আমাদের কাছে 11+10=21 কয়েন রয়েছে যা সর্বাধিক।

ইনপুট − L1-5, L2-5

আউটপুট −সর্বাধিক অর্থ যা দুটি ধাপে তোলা যায় − 10

ব্যাখ্যা − ধাপ 1 এ আমরা L1 থেকে 5টি কয়েন প্রত্যাহার করি, L1 5-1=4 কয়েন দ্বারা প্রতিস্থাপিত হবে।

ধাপ 2-এ L1-এ 4টি কয়েন এবং L2-এ 5টি কয়েন রয়েছে তাই আমরা L2 থেকে 5টি কয়েন নিই এবং আমাদের কাছে 5+5=10 কয়েন রয়েছে যা সর্বাধিক৷

নিম্নলিখিত প্রোগ্রামে ব্যবহৃত পদ্ধতি

  • আমাদের কাছে কিছু কয়েনের সাথে পূর্ণসংখ্যা হিসাবে দুটি লকার L1 এবং L2 রয়েছে।

  • ফাংশন maxMoney(int A, int B) লকারে কয়েনের সংখ্যা ইনপুট হিসাবে নেয়।

  • maxMoney() এর ভিতরে আমরা সর্বাধিক পরিমাণ অর্থ সঞ্চয় করতে পরিবর্তনশীল 'টাকা' নিই।

  • প্রাথমিকভাবে অর্থ A বা B থেকে যেটি বেশি হয় তার থেকে মূল্য নেয়।(money=A>B?A:B)

  • কোন পাত্রের কয়েন উত্তোলন করা হয়েছে তা পরীক্ষা করতে A বা B এর সাথে টাকার মূল্য তুলনা করুন।

  • এখন সেই পাত্রটিকে আগের পরিমাণের চেয়ে 1 কম দিয়ে প্রতিস্থাপন করুন। (A-- বা B--)

  • আবার টাকা A বা B থেকে যেটি বেশি হবে তার মান যোগ করবে। (টাকা+=A>B?A:B)

    k ছোট হলে সবচেয়ে ছোট k উপাদানের সর্বনিম্ন যোগফল −
  • হবে
  • D1-এ abs((পুরো অ্যারের যোগফল) - (2*সর্বনিম্ন k উপাদানের যোগফল))। দুবার কারণ অ্যারের সমষ্টিতেও এই উপাদানগুলি রয়েছে৷

    যদি k বড় হয় তাহলে সবচেয়ে বড় k উপাদানের সর্বোচ্চ যোগফল হবে −

  • D2-এ abs((পুরো অ্যারের যোগফল) - (2*সর্বোচ্চ k উপাদানের যোগফল))। দুবার কারণ অ্যারের সমষ্টিতেও এই উপাদানগুলি রয়েছে৷

  • D2 এর সাথে D1 তুলনা করুন এবং সর্বাধিক মান maxD-এ সংরক্ষণ করুন।

  • ফলাফল হিসাবে maxD ফেরত দিন।

উদাহরণ

Code:
#include <stdio.h>
#include <math.h>
// Function to return the maximum coins we can get
int maxMoney(int A, int B){
   //take coins
   int money=A>B?A:B;
   //refill the lockers with 1 less no.of coins
   if(money==A)
      A--;
   else
      B--;
   //withdraw again
   money+=A>B?A:B;
   return money;
}
// Driver code
int main(){
   int L1 = 8, L2 = 9;
   printf("Maximum money that can be withdrawn in two steps: %d" , maxMoney(L1, L2));
   return 0;
}

আউটপুট

যদি আমরা উপরের কোডটি চালাই তবে এটি নিম্নলিখিত আউটপুট −

উৎপন্ন করবে
Maximum money that can be withdrawn in two steps: 17

  1. সর্বাধিক সংখ্যা 2×2 বর্গক্ষেত্র যা C তে একটি সমদ্বিবাহু ত্রিভুজের ভিতরে ফিট করা যেতে পারে

  2. সর্বাধিক সংখ্যা যা C++ এ N সেগমেন্ট ব্যবহার করে সেভেন সেগমেন্ট ডিসপ্লেতে প্রদর্শিত হতে পারে

  3. সর্বাধিক বিশপ যা C++ এ N*N চেসবোর্ডে স্থাপন করা যেতে পারে

  4. সর্বাধিক দৈর্ঘ্যের চক্র যা C++ এ একটি বাইনারি গাছের দুটি নোড যোগ করে তৈরি করা যেতে পারে