[Buổi 25][Đóng gói][HW] Bài 3: Kho hàng theo lô an toàn


LÀM BÀI

Points: 100
Time limit: 1.0s
Memory limit: 256M

Author:
Problem types
Allowed languages
C++

Kho hàng theo lô an toàn

Bối cảnh

Một mặt hàng có stock và reserved — số lượng đã giữ chỗ cho đơn hàng. Invariant bắt buộc 0≤reserved≤stock. Các command:

  • RESTOCK x: stock tăng x nếu x>0.
  • RESERVE x: tăng reserved nếu x>0 và reserved+x≤stock.
  • CANCEL x: giảm reserved nếu x>0 và x≤reserved.
  • SHIP x: giao x đơn đã reserve, nên cả stock và reserved cùng giảm x; chỉ hợp lệ nếu x≤reserved.
  • INFO: in stock reserved available, với available=stock-reserved.

Bài Medium tập trung invariant nhiều field. Nếu main có thể sửa stock hoặc reserved trực tiếp, rất dễ tạo state vô nghĩa; vì vậy chúng phải private và mọi hành vi đi qua method.

Vì đây là phần encapsulation, mọi field tạo nên invariant cần được đặt sau một interface kiểm soát. Một command thất bại phải là thao tác atomic: state trước và sau phải giống nhau hoàn toàn. Khi có nhiều field liên quan, nên viết rõ điều kiện hợp lệ trước rồi mới thực hiện bất kỳ phép gán nào.

Yêu cầu

  1. Class Inventory private stock,reserved.
  2. Implement 4 mutations + getters.
  3. Command fail không đổi state.
  4. INFO như mô tả.

Input

Dòng 1 stock q; q command.

Output

Mỗi mutation in OK/FAIL; INFO một dòng.

Ràng buộc

0≤stock≤1e12, q≤5000.

Ví dụ 1

Input

10 7
RESERVE 6
RESERVE 5
CANCEL 2
SHIP 3
RESTOCK 4
INFO
RESERVE 7

Output

OK
FAIL
OK
OK
OK
11 1 10
OK

Giải thích

Reserve6 OK, reserve5 fail vì vượt stock10. Cancel2 làm reserved4. Ship3 làm reserved1 và stock7. Restock4 đưa stock11. INFO 11 1 10. Reserve7 sau đó vẫn hợp lệ vì available10.

Ví dụ này còn kiểm tra nguyên tắc atomic của interface: khi một điều kiện không đạt, object không được giữ lại thay đổi dở dang. Các dòng output vì vậy không chỉ phản ánh OK/FAIL mà còn xác nhận state sau mỗi command vẫn thỏa invariant của class.

Ví dụ 2

Input

0 5
RESERVE 1
RESTOCK 5
RESERVE 5
SHIP 5
INFO

Output

FAIL
OK
OK
OK
0 0 0

Giải thích

Stock0 nên reserve1 fail. Restock5 OK; reserve5 OK; ship5 làm stock0 reserved0. INFO 0 0 0.

Ví dụ này còn kiểm tra nguyên tắc atomic của interface: khi một điều kiện không đạt, object không được giữ lại thay đổi dở dang. Các dòng output vì vậy không chỉ phản ánh OK/FAIL mà còn xác nhận state sau mỗi command vẫn thỏa invariant của class.

Thông tin học tập

  • Module: M07
  • Buổi: B25
  • Loại bài: HOMEWORK
  • Độ khó: Medium
  • Concepts: class, private stock, batch operations, invariant, command simulation
  • Giới hạn kiến thức: B01-B25
  • Time limit: 1 second(s)
  • Memory limit: 256 MB
  • Point: 100

Comments

There are no comments at the moment.

Zalo