C10-03 · Top k
Xem dạng PDFĐề
Đọc danh sách lớp theo khung XS-07 (dòng mã sai bị bỏ qua lặng lẽ), sau đó là một số nguyên k. In k sinh viên có điểm học phần cao nhất, mỗi người một dòng dạng ma Ho Ten diem_hp loai (như C10-01), theo thứ tự:
- điểm học phần giảm dần (điểm học phần là giá trị
tinh_diem_hptrả về, đã làm tròn 1 chữ số thập phân — kể cả khi so để sắp xếp); - hai người bằng điểm thì mã nhỏ hơn đứng trước (khóa như
khoa_xep_hangcủa XS-05, mục 6.9).
Nếu k lớn hơn số sinh viên thì in hết cả lớp. Nếu k = 0 hoặc lớp không có ai thì không in gì.
Dữ liệu vào
- Dòng đầu: số nguyên n.
- n dòng tiếp theo, mỗi dòng dạng
ma ho ten diem_qt diem_ck(như C10-01). - Dòng cuối: số nguyên k.
Kết quả
min(k, số sinh viên hợp lệ) dòng theo thứ tự trên.
Ràng buộc
- 0 ≤ n ≤ 1000; 0 ≤ k ≤ 10⁹.
- Mã: 1–12 ký tự, chỉ gồm chữ số và chữ cái Latin; hợp lệ khi gồm đúng 8 chữ số. Các mã hợp lệ không trùng nhau.
- Họ tên: 1–10 từ, mỗi từ 1–20 chữ cái Latin không dấu, hoa thường tùy ý; giữa các phần có thể có nhiều dấu cách.
- Mỗi điểm trong đoạn [0; 10], dạng số nguyên hoặc một chữ số thập phân, dấu chấm hoặc dấu phẩy.
Gợi ý
Hàm khóa trả về tuple (-diem_hp, ma): Python so thành phần đầu (điểm đổi dấu nên điểm cao đứng trước), bằng nhau mới so mã. Đừng dùng reverse=True với khóa (diem_hp, ma) — nó đảo cả hai tiêu chí (mục 6.8). Lát cắt [:k] không bao giờ báo lỗi chỉ số và không phải lặp tới k. Mã giữ ở dạng chuỗi: với mã cùng 8 chữ số, so chuỗi cho cùng thứ tự như so số.
Ví dụ 1
Dữ liệu vào:
7
23010001 Nguyen Van An 7.5 8.0
23010002 Tran Thi Binh 6.5 7.0
23010003 Le Minh Duc 8.0 8.8
23010004 Pham Quoc Dung 4.0 4.0
23010005 Hoang Gia Han 5.0 3.0
23010006 Vu Ngoc Khanh 10.0 10.0
23010008 Nguyen Hoai Nam 9.0 7.0
3
Kết quả:
23010006 Vu Ngoc Khanh 10.0 A
23010003 Le Minh Duc 8.5 A
23010001 Nguyen Van An 7.8 B
Ví dụ 2
Dữ liệu vào:
4
23010009 Vo Tam 8 8
2301002 Tran Thi Binh 6.5 7.0
23010003 Le Minh Duc 8.0 8.8
23010001 Nguyen Van An 9 7.4
5
Kết quả:
23010003 Le Minh Duc 8.5 A
23010001 Nguyen Van An 8.0 B
23010009 Vo Tam 8.0 B
Giải thích ví dụ
- Ví dụ 1 (ví dụ của sách): điểm học phần Khanh 10,0; Duc 8,48 → 8,5; An 0,4 × 7,5 + 0,6 × 8,0 = 7,8 và Nam 0,4 × 9 + 0,6 × 7 = 7,8. An và Nam bằng điểm 7,8 nên mã nhỏ hơn (An, 23010001) đứng trước; với k = 3, Nam không được in.
- Ví dụ 2 (bổ sung): dòng
2301002 …mã sai bị bỏ, lớp còn 3 người nên k = 5 thì in hết. An (0,4 × 9 + 0,6 × 7,4 = 8,04 → 8,0) và Tam (8,0) bằng điểm: An mã 23010001 đứng trước Tam mã 23010009 dù Tam được nhập trước.
Nguồn trong sách: Bài C10-03, mục 10.5, giáo trình Lập trình cơ sở với Python — TS. Nguyễn Quốc Long · Mức: (**)