Tất cả thử thách
Dễ 0 đã giải Tỷ lệ chấp nhận 0%

Decorator cho giá tiền

Bọc một giá gốc bằng các decorator giảm giá, thuế, phí vận chuyển và coupon được áp dụng theo thứ tự.

Bạn sẽ học được gì

  • Xếp các hành vi thành lớp quanh một giá trị
  • Áp dụng phần trăm theo đúng thứ tự
  • Chặn giá trị để không bao giờ xuống dưới 0

Đề bài

Xem bản gốc (English)

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ụ

Ví dụ 1
Đầ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.

Ví dụ 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.

Học hỏi từ người khác

Giải pháp cộng đồng

Chưa có giải pháp nào được chia sẻ. Hãy giải thử thách này để đăng giải pháp đầu tiên.