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] 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, 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
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
1000
calls will be made to getBill
.10^-5
of the actual value will be accepted as correct.use std::collections::HashMap;
struct Cashier {
n: usize,
index: usize,
discount: f64,
inventory: HashMap<i32, f64>,
}
impl Cashier {
fn new(n: i32, discount: i32, products: Vec<i32>, prices: Vec<i32>) -> Self {
let n = n as usize;
let index = 0;
let discount = (100 - discount) as f64 / 100.0;
let mut inventory: HashMap<i32, f64> = HashMap::new();
for (id, price) in products.into_iter().zip(prices.into_iter()) {
inventory.insert(id, price as f64);
}
Cashier {
n,
index,
inventory,
discount,
}
}
fn get_bill(&mut self, products: Vec<i32>, amount: Vec<i32>) -> f64 {
let mut res = 0.0;
for (id, amount) in products.into_iter().zip(amount.into_iter()) {
res += self.inventory[&id] * amount as f64;
}
self.index += 1;
if self.index == self.n {
self.index = 0;
res * self.discount
} else {
res
}
}
}
#[test]
fn test() {
use assert_approx_eq::assert_approx_eq;
let mut cashier = Cashier::new(
3,
50,
vec![1, 2, 3, 4, 5, 6, 7],
vec![100, 200, 300, 400, 300, 200, 100],
);
assert_approx_eq!(cashier.get_bill(vec![1, 2], vec![1, 2]), 500.0);
assert_approx_eq!(cashier.get_bill(vec![3, 7], vec![10, 10]), 4000.0);
assert_approx_eq!(
cashier.get_bill(vec![1, 2, 3, 4, 5, 6, 7], vec![1, 1, 1, 1, 1, 1, 1]),
800.0
);
assert_approx_eq!(cashier.get_bill(vec![4], vec![10]), 4000.0);
assert_approx_eq!(cashier.get_bill(vec![7, 3], vec![10, 10]), 4000.0);
assert_approx_eq!(
cashier.get_bill(vec![7, 5, 3, 1, 6, 4, 2], vec![10, 10, 10, 9, 9, 9, 7]),
7350.0
);
assert_approx_eq!(cashier.get_bill(vec![2, 3, 5], vec![5, 3, 2]), 2500.0);
}