[LeetCode] 1357. Apply Discount Every n Orders 每隔n个顾客打折
There is a supermarket that is frequented by many customers. The products sold at the supermarket are represented as two parallel integer arrays products
and prices
, where the ith
product has an ID of products[i]
and a price of prices[i]
.
When a customer is paying, their bill is represented as two parallel integer arrays product
and amount
, where the jth
product they purchased has an ID of product[j]
, and amount[j]
is how much of the product they bought. Their subtotal is calculated as the sum of each amount[j] * (price of the jth product)
.
The supermarket decided to have a sale. Every nth
customer paying for their groceries will be given a percentage discount. The discount amount is given by discount
, where they will be given discount
percent off their subtotal. More formally, if their subtotal is bill
, then they would actually pay bill * ((100 - discount) / 100)
.
Implement the Cashier
class:
Cashier(int n, int discount, int[] products, int[] prices)
Initializes the object withn
, thediscount
, and theproducts
and theirprices
.double getBill(int[] product, int[] amount)
Returns the final total of the bill with the discount applied (if any). Answers within10-5
of the actual value will be accepted.
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]
Explanation
Cashier 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. 1st customer, no discount.
// bill = 1 * 100 + 2 * 200 = 500.
cashier.getBill([3,7],[10,10]); // return 4000.0. 2nd customer, no discount.
// bill = 10 * 300 + 10 * 100 = 4000.
cashier.getBill([1,2,3,4,5,6,7],[1,1,1,1,1,1,1]); // return 800.0. 3rd customer, 50% discount.
// Original bill = 1600
// Actual bill = 1600 * ((100 - 50) / 100) = 800.
cashier.getBill([4],[10]); // return 4000.0. 4th customer, no discount.
cashier.getBill([7,3],[10,10]); // return 4000.0. 5th customer, no discount.
cashier.getBill([7,5,3,1,6,4,2],[10,10,10,9,9,9,7]); // return 7350.0. 6th customer, 50% discount.
// Original bill = 14700, but with
// Actual bill = 14700 * ((100 - 50) / 100) = 7350.
cashier.getBill([2,3,5],[5,3,2]); // return 2500.0. 7th customer, no discount.
Constraints:
1 <= n <= 104
0 <= discount <= 100
1 <= products.length <= 200
prices.length == products.length
1 <= products[i] <= 200
1 <= prices[i] <= 1000
- The elements in
products
are unique. 1 <= product.length <= products.length
amount.length == product.length
product[j]
exists inproducts
.1 <= amount[j] <= 1000
- The elements of
product
are unique. - At most
1000
calls will be made togetBill
. - Answers within
10-5
of the actual value will be accepted.
这道题让给每n个订单打折,给了个折扣数,以及产品和价格数组,表示 products[i] 产品的价格为 prices[i],现在给了一个产品组 product 和数量数组 amount,表示购买 product[i] 产品的数量为 ampunt[i] 个,让求给定的订单的价格。这道题没有太大的难度,先用一个 HashMap 来简历产品和其价格之间的映射,然后用个全局变量 cnt 来统计已接受订单的个数。在 getBill 函数中,先计算出买所有订单内的产品的总价,然后判断当前的订单个数 cnt 是否能整除n,能的话再计算出打折后的价格即可,参见代码如下:
class Cashier {
public:
Cashier(int n, int discount, vector<int>& products, vector<int>& prices) {
this->n = n;
this->discount = discount;
this->cnt = 0;
for (int i = 0; i < products.size(); ++i) {
m[products[i]] = prices[i];
}
}
double getBill(vector<int> product, vector<int> amount) {
double res = 0;
for (int i = 0; i < product.size(); ++i) {
res += m[product[i]] * amount[i];
}
if (++cnt % n == 0) {
res = (res * (100 - discount)) / 100;
}
return res;
}
private:
int n, discount, cnt;
unordered_map<int, int> m;
};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/1357
类似题目:
Apply Discount to Prices
参考资料:
https://leetcode.com/problems/apply-discount-every-n-orders