[Buổi 29][Đa hình][ADV] Bài 1: Report Engine đa hình có xếp hạng
Report Engine đa hình có xếp hạng
Bối cảnh
Một report engine nhận ba loại item:
SALE id revenue returns: score = revenue - 2*returns.EXPENSE id amount risk: score = -(amount + 10*risk).INVENTORY id stock demand: score = min(stock,demand)*5 - abs(stock-demand).
Mọi item kế thừa abstract ReportItem với score(), type(), render(). Hệ thống tính tổng score, xếp toàn bộ item theo score giảm; tie type tăng, id tăng; in top k theo type:id:score và đếm số item có score âm.
Bài Hard yêu cầu collection polymorphic thực sự, ranking qua virtual score, render qua virtual interface và cleanup an toàn. Sau creation không được switch type ở phase xử lý.
Ở 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
- Abstract ReportItem + virtual destructor.
- Ba derived class.
- TOTALSCORE, TOP k, NEGATIVECOUNT.
- Không switch trong processing.
Input
Dòng 1 n k; n dòng bắt đầu S/E/I.
Output
Ba dòng summary.
Ràng buộc
1≤n≤5000, score vừa long long.
Ví dụ 1
Input
5 3
S A 100 10
E B 50 2
I C 20 10
S D 50 0
I E 5 20
Output
TOTALSCORE 110
TOP SALE:A:80 SALE:D:50 INVENTORY:C:40
NEGATIVECOUNT 1
Giải thích
Scores: SALE A=80, EXPENSE B=-70, INVENTORY C=40, SALE D=50, INVENTORY E=10. Total110, negative1. Ranking A80,D50,C40,E10,B-70; TOP3 là A,D,C.
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 5
E A 0 0
S B 0 0
I C 0 0
Output
TOTALSCORE 0
TOP EXPENSE:A:0 INVENTORY:C:0 SALE:B:0
NEGATIVECOUNT 0
Giải thích
Cả ba score đều0. Tie type alphabetic EXPENSE < INVENTORY < SALE, nên TOP vẫn chỉ in ba item theo thứ tự đó; negative count0.
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: ADVANCED
- Độ khó: Hard
- Concepts: abstract base, virtual score/render, polymorphic collection, sorting pointers
- Giới hạn kiến thức: B01-B29
- Time limit: 2 second(s)
- Memory limit: 256 MB
- Point: 100
Comments