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

C++でのショッピングオファー


店舗があるとすると、販売するアイテムがいくつかあります。各アイテムにはいくつかの価格があります。ただし、いくつかの特別オファーがあり、特別オファーは、セール価格の1つまたは複数の異なる種類のアイテムで構成されます。つまり、価格のリスト、一連の特別オファー、および各アイテムに対して購入する必要のある数があります。タスクは、特別オファーを最適に利用できる、与えられた特定のアイテムに支払う必要のある最低価格を見つけることです。

ここで、各特別オファーは配列の形式で表され、最後の数字はこの特別オファーに支払う必要のある価格を表し、他の数字はこのオファーを購入した場合に取得できる特定のアイテムの数を表します。

したがって、入力が[2,5]、[[3,0,5]、[1,2,10]]、[3,2]の場合、出力は14になります。これは2種類あるためです。アイテムのAとB。それらの価格はそれぞれ2ドルと5ドルです。特別オファー1では、3Aと0Bに5ドルを支払うことができます。特別オファー2では、1Aと2Bに$10を支払うことができます。 3Aと2Bを購入する必要があるため、1Aと2B(特別オファー2)に10ドル、2Aに4ドル支払う場合があります。

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

  • メモと呼ばれるマップを定義する

  • directPurchase()というメソッドを定義します。これには価格がかかり、配列が必要です

  • ret:=0

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

    • ret:=ret + price [i] * need [i]

  • retを返す

  • 1つのヘルパーメソッドを定義します。これには、価格配列、特別オファーマトリックス、配列のニーズ、およびインデックスが必要です-

  • メモにニーズがある場合は、メモを返します[必要]

  • ret:=directPurchase(price、need)

  • 特別オファーマトリックスの行数に対する範囲インデックスのiの場合– 1

    • 必要な場合[j]

    • need [j] – special [i、j]を一時配列に挿入

  • okがtrueの場合、

    • op1:=special [i] + helper(price、special、temp、i)の最後の列要素

    • ret:=retとop1の最小値

  • memo [needs]:=ret and return

  • メインの方法から、次のようにします-

  • リターンヘルパー(価格、特別、ニーズ、0)

例(C ++)

理解を深めるために、次の実装を見てみましょう-

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   map <vector <int> , int> memo;
   int shoppingOffers(vector<int>& price, vector<vector<int>>& special, vector<int>& needs) {
      return helper(price, special, needs, 0);
   }
   int helper(vector <int>& price, vector < vector <int> >& special, vector <int>& needs, int idx){
      if(memo.count(needs)) return memo[needs];
      int ret = directPurchase(price, needs);
      for(int i = idx; i < special.size(); i++){
         vector <int> temp;
         bool ok = true;
         for(int j = 0; j < special[i].size() - 1; j++){
            if(needs[j] < special[i][j]) {
               ok = false;
               break;
            }
            temp.push_back(needs[j] - special[i][j]);
         }
         if(ok){
            int op1 = special[i][special[i].size() - 1] + helper(price, special, temp, i);
            ret = min(ret, op1);
         }
      }
      return memo[needs] = ret;
   }
   int directPurchase(vector <int>& price, vector <int>& needs){
      int ret = 0;
      for(int i = 0; i < price.size(); i++){
         ret += price[i] * needs[i];
      }
      return ret;
   }
};
main(){
   vector<int> v1 = {2,5};
   vector<vector<int>> v2 = {{3,0,5},{1,2,10}};
   vector<int> v3 = {3,2};
   Solution ob;
   cout << (ob.shoppingOffers(v1, v2, v3));
}

入力

[2,5]
[[3,0,5],[1,2,10]]
[3,2]

出力

14

  1. C++でのリスのシミュレーション

    木、リス、そしていくつかのナッツがあります。位置は、2Dグリッドのセルで表されます。あなたの目標は、リスがすべてのナッツを集めて、それらを1つずつ木の下に置くための最小距離を見つけることです。リスは一度に最大で1つのナットしかとることができず、隣接するセルに向かって上下左右の4つの方向に移動できます。距離は移動回数で表されます。 したがって、入力が高さ:5幅:7木の位置:[2,2]リス:[4,4]ナッツ:[[3,0]、[2,5]]の場合、出力は12になります。 、 これを解決するには、次の手順に従います- 関数calc()を定義します。これには、x1、y1、x2、y2、が必要で

  2. C++の長方形エリアII

    (軸に沿った)長方形のリストがあるとします。ここで、各rectangle [i] ={x1、y1、x2、y2}です。ここで、(x1、y1)は左下隅のポイントであり、(x2、y2)は右上隅のポイントです。 i番目の長方形。 平面内のすべての長方形でカバーされる総面積を見つける必要があります。答えは非常に大きい可能性があるため、モジュロ10 ^ 9+7を使用できます。 したがって、入力が次のような場合 その場合、出力は6になります。 これを解決するには、次の手順に従います- m =10 ^ 9 + 7 関数add()を定義します。これには、a、b、が必要です。 r