Formatted question description: https://leetcode.ca/all/1357.html

# 1357. Apply Discount Every n Orders (Medium)

There is a sale in a supermarket, there will be a `discount`

every `n`

customer.

There are some products in the supermarket where the id of the `i-th`

product is `products[i]`

and the price per unit of this product is `prices[i]`

.

The system will count the number of customers and when the `n-th`

customer arrive he/she will have a `discount`

on the bill. (i.e if the cost is `x`

the new cost is `x - (discount * x) / 100`

). Then the system will start counting customers again.

The customer orders a certain amount of each product where `product[i]`

is the id of the `i-th`

product the customer ordered and `amount[i]`

is the number of units the customer ordered of that product.

Implement the `Cashier`

class:

`Cashier(int n, int discount, int[] products, int[] prices)`

Initializes the object with`n`

, the`discount`

, the`products`

and their`prices`

.`double getBill(int[] product, int[] amount)`

returns the value of the bill and apply the discount if needed. Answers within`10^-5`

of the actual value will be accepted as correct.

**Example 1:**

Input["Cashier","getBill","getBill","getBill","getBill","getBill","getBill","getBill"] [[3,50,[1,2,3,4,5,6,7],[100,200,300,400,300,200,100]],[[1,2],[1,2]],[[3,7],[10,10]],[[1,2,3,4,5,6,7],[1,1,1,1,1,1,1]],[[4],[10]],[[7,3],[10,10]],[[7,5,3,1,6,4,2],[10,10,10,9,9,9,7]],[[2,3,5],[5,3,2]]]Output[null,500.0,4000.0,800.0,4000.0,4000.0,7350.0,2500.0]ExplanationCashier cashier = new Cashier(3,50,[1,2,3,4,5,6,7],[100,200,300,400,300,200,100]); cashier.getBill([1,2],[1,2]); // return 500.0, bill = 1 * 100 + 2 * 200 = 500. cashier.getBill([3,7],[10,10]); // return 4000.0 cashier.getBill([1,2,3,4,5,6,7],[1,1,1,1,1,1,1]); // return 800.0, The bill was 1600.0 but as this is the third customer, he has a discount of 50% which means his bill is only 1600 - 1600 * (50 / 100) = 800. cashier.getBill([4],[10]); // return 4000.0 cashier.getBill([7,3],[10,10]); // return 4000.0 cashier.getBill([7,5,3,1,6,4,2],[10,10,10,9,9,9,7]); // return 7350.0, Bill was 14700.0 but as the system counted three more customers, he will have a 50% discount and the bill becomes 7350.0 cashier.getBill([2,3,5],[5,3,2]); // return 2500.0

**Constraints:**

`1 <= n <= 10^4`

`0 <= discount <= 100`

`1 <= products.length <= 200`

`1 <= products[i] <= 200`

- There are
**not**repeated elements in the array`products`

. `prices.length == products.length`

`1 <= prices[i] <= 1000`

`1 <= product.length <= products.length`

`product[i]`

exists in`products`

.`amount.length == product.length`

`1 <= amount[i] <= 1000`

- At most
`1000`

calls will be made to`getBill`

. - Answers within
`10^-5`

of the actual value will be accepted as correct.

**Related Topics**:

Design

## Solution 1.

```
// OJ: https://leetcode.com/problems/apply-discount-every-n-orders/
// Time:
// Cashier: O(P) where P is the count of all products
// getBill: O(N) where N is the count of product the customer bought
// Space: O(P)
class Cashier {
int num = 0, n, discount;
unordered_map<int, int> m;
public:
Cashier(int n, int discount, vector<int>& products, vector<int>& prices) : n(n), discount(discount) {
for (int i = 0; i < products.size(); ++i) m[products[i]] = prices[i];
}
double getBill(vector<int> product, vector<int> amount) {
double p = 0;
for (int i = 0; i < product.size(); ++i) p += m[product[i]] * amount[i];
if (++num % n == 0) p -= (discount * p) / 100;
return p;
}
};
```