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

C++-এ প্রতি n অর্ডারে ডিসকাউন্ট প্রয়োগ করা


ধরুন একটি সুপারমার্কেটে সেল চলছে, প্রতি n কাস্টমারে ডিসকাউন্ট থাকবে। কয়েকটি প্রোডাক্ট আছে যেখানে i-তম প্রোডাক্টের আইডি products[i] এবং প্রতি ইউনিট দাম prices[i]। সিস্টেম কাস্টমার কাউন্ট রাখবে এবং n-তম কাস্টমার এলেই তার বিলে ডিসকাউন্ট मिलবে। তারপর সিস্টেম আবার কাউন্ট শুরু করবে। কাস্টমার নির্দিষ্ট পরিমাণে প্রোডাক্ট অর্ডার করবে যেখানে product[i] হলো i-তম অর্ডারকৃত প্রোডাক্টের আইডি এবং amount[i] হলো সেটির ইউনিট সংখ্যা। এই সিস্টেম ইমপ্লিমেন্ট করতে হবে। Cashier ক্লাসে এই মেথডগুলো থাকবে:

  • Cashier(int n, int discount, int[] products, int[] prices) কনস্ট্রাক্টর যা n, ডিসকাউন্ট, প্রোডাক্টস ও প্রাইসেস দিয়ে ইনিশিয়ালাইজ করে।

  • double getBill(int[] product, int[] amount) এটি বিলের ভ্যালু রিটার্ন করবে এবং প্রয়োজনে ডিসকাউন্ট প্রয়োগ করবে। 10^-5 টলারেন্স একসেপ্টেবল।

উদাহরণস্বরূপ, Cashier(3, 50, [1,2,3,4,5,6,7], [100,200,300,400,300,200,100]) দিয়ে ইনিশিয়ালাইজ করে getBill কল করলে −

getBill([1,2],[1,2]), getBill([3,7],[10,10]), getBill([1,2,3,4,5,6,7],[1,1,1,1,1,1,1]), getBill([4],[10]), getBill([7,3],[10,10]), getBill([7,5,3,1,6,4,2],[10,10,10,9,9,9,7]), getBill([2,3,5],[5,3,2]) — আউটপুট: [500.0, 4000.0, 800.0, 4000.0, 4000.0, 7350.0, 2500.0]

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

  • order নামক একটি map ডিফাইন করুন

  • Cashier কনস্ট্রাক্টর:

  • curr := 0

  • i = 0 থেকে prices array-এর সাইজ পর্যন্ত

    • order[products[i]] := prices[i]

  • discount সেট করুন

  • getBill মেথড:

  • curr ১ বাড়ান, flag := true যদি curr == n, অন্যথায় false

  • যদি curr == n হয়, তবে curr := 0

  • ret := 0

  • i = 0 থেকে product array size - 1 পর্যন্ত

    • x := pro[i]

    • cost := order[x]

    • y := amount[i]

    • ret += cost * y

  • যদি flag সেট থাকে, তবে ret := ret - (ret * discount) / 100

  • ret রিটার্ন করুন

উদাহরণ (C++)

নিচের ইমপ্লিমেন্টেশন দেখুন ভালো বুঝতে −

#include <bits/stdc++.h> using namespace std; class Cashier { public:    int curr;    map <double, double> order;    int n;    int discount;    Cashier(int n, int discount, vector<int>& pro, vector<int>& p) {       curr = 0;       for(int i = 0; i < p.size(); i++){          order[pro[i]] = p[i];       }       this->n = n;       this->discount = discount;    }    double getBill(vector<int> pro, vector<int> am) {       curr++;       bool flag = curr == n;       if(curr == n){          curr = 0;       }       double ret = 0;       for(int i = 0; i < pro.size(); i++){          double x = pro[i];          double cost = order[x];          double y = am[i];          ret += (cost * y);       }       if(flag) ret = ret - (ret * discount) / 100;       return ret;    } }; main(){    vector<int> v1 = {1,2,3,4,5,6,7}, v2 =    {100,200,300,400,300,200,100};    Cashier ob(3, 50, v1, v2);    v1 = {1,2}, v2 = {1,2};    cout << (ob.getBill(v1, v2)) << endl;    v1 = {3,7}, v2 = {10,10};    cout << (ob.getBill(v1, v2)) << endl;    v1 = {1,2,3,4,5,6,7}, v2 = {1,1,1,1,1,1,1};    cout << (ob.getBill(v1, v2)) << endl;    v1 = {4}, v2 = {10};    cout << (ob.getBill(v1, v2)) << endl;    v1 = {7,3}, v2 = {10,10};    cout << (ob.getBill(v1, v2)) << endl;    v1 = {7,5,3,1,6,4,2}, v2 = {10,10,10,9,9,9,7};    cout << (ob.getBill(v1, v2)) << endl;    v1 = {2,3,5}, v2 = {5,2,3};    cout << (ob.getBill(v1, v2)) << endl; }

ইনপুট

main ফাংশন দেখুন

আউটপুট

500 4000 800 4000 4000 7350 2500
  1. C++ দিয়ে একই অ্যারেতে প্রতিটি এলিমেন্টের ফ্লোর (Floor) বের করা

  2. C++ দিয়ে সবচেয়ে বড় সাবসেট বের করা যাতে প্রতিটি জোড়ার যোগফল প্রাইম (Prime)

  3. সি++-এ প্রতিটি ইনসারশনের পর K-তম সর্বনিম্ন উপাদান বের করা

  4. OpenCV-এ C++ ব্যবহার করে হিস্টোগ্রাম ইক্যুয়ালাইজার প্রয়োগ করা