[Buổi 29][Đa hình][ADV] Bài 1: Report Engine đa hình có xếp hạng


LÀM BÀI

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

Author:
Problem types
Allowed languages
C++

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

  1. Abstract ReportItem + virtual destructor.
  2. Ba derived class.
  3. TOTALSCORE, TOP k, NEGATIVECOUNT.
  4. 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

There are no comments at the moment.

Zalo