[Buổi 29][Đa hình][HW] Bài 4: Kênh thông báo đa hình


LÀM BÀI

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

Author:
Problem types
Allowed languages
C++

Kênh thông báo đa hình

Bối cảnh

Một notification engine có abstract Channel với cost(length)label(). SMS tính 2*length, Email tính ceil(length/10), Push miễn phí. Với mỗi thông báo, runtime type của channel quyết định chi phí. Hệ thống cần in chi phí từng message, tổng chi phí và channel có tổng chi phí cao nhất; tie label tăng.

Bài Medium yêu cầu sau khi object channel được tạo, phase cost aggregation chỉ gọi virtual interface chứ không kiểm tra type tag lại.

Ở B29, sau khi runtime object đã được tạo, phase xử lý nên làm việc thông qua interface base. Nếu code tiếp tục if/switch theo type trong từng phép tính, polymorphism chưa thực sự được sử dụng. Base cần virtual destructor nếu object bị xóa qua base pointer, và collection phải tránh object slicing để dynamic type được giữ nguyên.

Ở B29, sau khi runtime object đã được tạo, phase xử lý nên làm việc thông qua interface base. Nếu code tiếp tục if/switch theo type trong từng phép tính, polymorphism chưa thực sự được sử dụng. Base cần virtual destructor nếu object bị xóa qua base pointer, và collection phải tránh object slicing để dynamic type được giữ nguyên.

Yêu cầu

  1. Base Channel virtual cost/label.
  2. Derived SMS/EMAIL/PUSH.
  3. Đọc n message.
  4. In từng cost, TOTAL, TOPCHANNEL.

Input

Dòng 1 n; n dòng S/E/P length.

Output

n dòng cost; rồi TOTAL và TOPCHANNEL.

Ràng buộc

1≤n≤5000, length≥0.

Ví dụ 1

Input

4
S 10
E 11
P 100
S 5

Output

20
2
0
10
TOTAL 32
TOPCHANNEL SMS 30

Giải thích

Chi phí là SMS10→20, Email11→2, Push→0, SMS5→10. Tổng32. Theo channel: SMS30, EMAIL2, PUSH0 nên TOPCHANNEL là SMS 30.

Mẫu này không chỉ kiểm tra giá trị số cuối mà còn kiểm tra dynamic dispatch. Cùng một call-site qua interface base phải chọn implementation đúng với runtime type. Nếu quên virtual, bị slicing hoặc giữ switch sai chỗ, output của một trong các loại object sẽ khác ngay ở bước trace này.

Ví dụ 2

Input

3
P 1
P 2
P 3

Output

0
0
0
TOTAL 0
TOPCHANNEL PUSH 0

Giải thích

Ba message đều Push nên từng cost0, total0. Chỉ channel PUSH xuất hiện nên TOPCHANNEL PUSH 0.

Mẫu này không chỉ kiểm tra giá trị số cuối mà còn kiểm tra dynamic dispatch. Cùng một call-site qua interface base phải chọn implementation đúng với runtime type. Nếu quên virtual, bị slicing hoặc giữ switch sai chỗ, output của một trong các loại object sẽ khác ngay ở bước trace này.

Thông tin học tập

  • Module: M08
  • Buổi: B29
  • Loại bài: HOMEWORK
  • Độ khó: Medium
  • Concepts: abstract interface, virtual cost, polymorphic aggregation
  • Giới hạn kiến thức: B01-B29
  • Time limit: 1 second(s)
  • Memory limit: 256 MB
  • Point: 100

Comments

There are no comments at the moment.

Zalo