C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でn注文ごとに割引を適用する


スーパーマーケットでセールがあるとすると、n人の顧客ごとに割引が適用されます。スーパーマーケットに、i番目の商品のIDがproducts [i]であり、この商品の単位あたりの価格がprices[i]である商品があるとします。ここでは、システムが顧客の数をカウントし、n番目の顧客が到着すると、請求額が割引になります。その後、システムは再び顧客のカウントを開始します。顧客は各製品の特定の量を注文します。ここで、product [i]は顧客が注文したi番目の製品のIDであり、amount[i]は顧客がその製品に注文したユニットの数です。したがって、このシステムを実装する必要があります。キャッシャークラスにはこれらのメソッドがあります

  • Cashier(int n、int discount、int [] products、int [] price)このコンストラクターは、オブジェクトを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])を使用してCashierを初期化し、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]), then the outputs will be [500.0, 4000.0, 800.0, 4000.0, 4000.0, 7350.0, 2500.0]
になります

これを解決するには、次の手順に従います-

  • orderというマップを定義する

  • キャッシャーは次のように機能します-

  • curr:=0

  • 0から価格配列のサイズまでの範囲のiの場合

    • order [produce [i]]:=price [i]

  • 与えられた割引率として割引を設定する

  • getBillメソッドは次のように機能します-

  • currを1増やし、フラグを設定します:=curr =nの場合はtrue、それ以外の場合はfalse

  • curr =nの場合、curr:=0

    を設定します
  • ret:=0

  • 0から製品配列のサイズまでの範囲のiの場合– 1

    • x:=pro [i]

    • コスト:=注文[x]

    • y:=amount [i]

    • コストでretを増やす*y

  • フラグが設定されている場合、ret:=ret –(ret *割引)/ 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;
}

入力

See the main function

出力

500
4000
800
4000
4000
7350
2500

  1. C++に挿入するたびにK番目に小さい要素

    このチュートリアルでは、 k-thを見つけます。 挿入するたびに最小の要素。 最小ヒープを使用して問題を解決します。プログラムを完了するための手順を見てみましょう。 ランダムデータでアレイを初期化します。 優先キューを初期化します。 k-1まで、k番目はありません 最小の要素。だから、好きな記号を印刷してください。 k+1からnまで繰り返すループを作成します。 最小ヒープのルートを印刷します。 要素が最小ヒープのルートより大きい場合は、ルートをポップして要素を挿入します。 例 コードを見てみましょう。 #include <bits/stdc++.h> using n

  2. C ++を使用してOpenCVでヒストグラム均等化を適用するにはどうすればよいですか?

    ヒストグラムは、画像の深度強度を表します。たとえば、色深度が8ビットの画像について考えてみます。これは、すべてのピクセルが0から平均0から255までの色深度を持つことができることを意味します。画像がRGB画像の場合、赤、緑、青のチャネルがあります。たとえば、画像のポイントには赤しかありません。次に、その画像の色深度は赤チャネルにあり、ピクセルの値は0から255まで変化します。0は赤がないことを意味し、255はより多くの読み取りを意味します。 ヒストグラムは、すべてのチャネルとすべての色についてこの種の結果を示しています。ピクセルの値を変更することにより、特定のカラーピクセルの強度を変更できま