Đề bài
Mẫu decorator thêm hành vi bằng cách bọc một đối tượng trong nhiều lớp. Mỗi lớp ở đây sẽ thay đổi giá của lớp bên trong nó.
Bắt đầu từ base_price và áp dụng các decorator theo thứ tự:
discount p: giảm giá đi p phần trăm.tax p: tăng giá lên p phần trăm.shipping a: cộng thêm một khoản cố định a.coupon a: trừ đi a, nhưng không bao giờ thấp hơn 0.
Cài đặt price_decorators(base_price, decorators).
Input
base_price: Giá ban đầu.
decorators: Các lớp, theo thứ tự chúng bọc lấy giá. Các khoản có thể có phần thập phân.
Output
Trả về giá cuối cùng. Chấp nhận đáp án sai số trong phạm vi 1e-6.
Ràng buộc
0 ≤ base_price ≤ 1,000,000
0 ≤ số decorator ≤ 100; 0 ≤ p ≤ 100, 0 ≤ a ≤ 100,000
Ví dụ
Đầu vào:
base_price = 100
decorators = ["discount 10", "tax 8", "shipping 5"]
Kết quả mong đợi:
expected = 102.2
Đầu vào:
long long base_price = 100;
std::vector<std::string> decorators = {"discount 10", "tax 8", "shipping 5"};
Kết quả mong đợi:
double expected = 102.2;
Đầu vào:
long base_price = 100;
string[] decorators = new string[] {"discount 10", "tax 8", "shipping 5"};
Kết quả mong đợi:
double expected = 102.2;
Giải thích
100 − 10% = 90, cộng 8% thuế = 97.2, cộng 5 phí vận chuyển = 102.2.
Đầu vào:
base_price = 20
decorators = ["coupon 25", "shipping 4"]
Kết quả mong đợi:
expected = 4.0
Đầu vào:
long long base_price = 20;
std::vector<std::string> decorators = {"coupon 25", "shipping 4"};
Kết quả mong đợi:
double expected = 4.0;
Đầu vào:
long base_price = 20;
string[] decorators = new string[] {"coupon 25", "shipping 4"};
Kết quả mong đợi:
double expected = 4.0;
Giải thích
Phiếu giảm giá sẽ làm giá xuống dưới 0 nên giá dừng ở 0; sau đó phí vận chuyển làm giá thành 4.
Hướng tiếp cận
Hãy tự thử trước, sau đó mở từng gợi ý một.
Gợi ý 1
Áp dụng các lớp đúng theo thứ tự cho trước.
Gợi ý 2
Phần trăm tính trên giá hiện tại, không phải giá gốc.
Gợi ý 3
Phiếu giảm giá không bao giờ làm giá xuống dưới 0.
Độ phức tạp mong đợi
thời gian O(số decorator), bộ nhớ phụ O(1)
Tham khảo
Thử thách này đã được điều chỉnh cho CodeUtility. Hãy làm theo đề bài và các ràng buộc ở trên.