XS-05 · Bảng điểm và xếp hạng

Xem dạng PDF

Gửi bài giải

Điểm: 1,00
Giới hạn thời gian: 1.0s
Giới hạn bộ nhớ: 256M
Input: stdin
Output: stdout

Tác giả:
Nguồn bài:
Sách "Lập trình cơ sở với Python"
Dạng bài
Ngôn ngữ cho phép
Python

Đề

Phần 5 của bài toán xuyên suốt "Điểm học phần". Mang theo từ XS-04 (mục 5.7): hai hàm tinh_diem_hp(diem_qt, diem_ck) (điểm học phần ~0{,}4 \times~ quá trình ~+~ ~0{,}6 \times~ cuối kỳ, đã làm tròn 1 chữ số thập phân) và xep_loai(diem_hp).

Đọc mã và điểm của ~n~ sinh viên, xếp hạng theo điểm học phần giảm dần; hai sinh viên bằng điểm thì mã nhỏ hơn đứng trước. In ~k~ sinh viên đứng đầu.

Kiến thức dùng (Chương 6): danh sách, append, tuple (ma, diem_hp), tháo gói tuple, sorted(…, key=ham) với hàm khóa viết bằng def.

Dữ liệu vào

  • Dòng đầu: hai số nguyên n k.
  • ~n~ dòng tiếp theo, mỗi dòng ma diem_qt diem_ck cách nhau một dấu cách.

Kết quả

~k~ dòng; dòng thứ ~i~ gồm: thứ hạng ~i~ (bắt đầu từ 1), mã, điểm học phần (đúng 1 chữ số thập phân), loại — cách nhau một dấu cách.

Ràng buộc

  • ~1 \le k \le n \le 100~.
  • Mã gồm đúng 8 chữ số (có thể bắt đầu bằng 0), các mã đôi một khác nhau. Mã là chuỗi: in đúng như đã đọc.
  • ~0 \le~ mỗi điểm ~\le 10~; mỗi điểm viết dạng số nguyên (10) hoặc có đúng một chữ số thập phân (7.5), dùng dấu chấm.
  • "Bằng điểm" nghĩa là bằng nhau sau khi làm tròn (so sánh trên giá trị tinh_diem_hp trả về).

Ví dụ

Dữ liệu vào:

6 3
23010001 7.5 8.0
23010002 6.5 7.0
23010003 8.0 8.8
23010004 4.0 4.0
23010005 5.0 3.0
23010006 10.0 10.0

Kết quả:

1 23010006 10.0 A
2 23010003 8.5 A
3 23010001 7.8 B

Giải thích ví dụ

Điểm học phần của sáu người là ~7{,}8;\ 6{,}8;\ 8{,}5;\ 4{,}0;\ 3{,}8;\ 10{,}0~. Xếp giảm dần: 23010006 (~10{,}0~), 23010003 (~8{,}5~), 23010001 (~7{,}8~), … Với ~k = 3~ chỉ in ba người đầu, kèm thứ hạng 1, 2, 3 và loại tính lại bằng xep_loai.

Hàm khóa của sách 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ã (tăng dần). Các ca nên tự thử:

Dữ liệu vào Kết quả Ý nghĩa
3 3 / 23010007 6.5 7.0 / 23010005 5.0 3.0 / 23010002 6.5 7.0 1 23010002 6.8 C / 2 23010007 6.8 C / 3 23010005 3.8 F bằng điểm: mã nhỏ đứng trước dù nhập sau
2 1 / 23010005 5.0 3.0 / 23010006 10 10 1 23010006 10.0 A ~k < n~, người đứng đầu nhập sau cùng

(dấu / ngăn cách các dòng)

Lưu ý khi nộp

  • sorted(…, reverse=True) với khóa (diem, ma) đảo cả hai tiêu chí: bằng điểm thì mã lớn lại đứng trước — sai.
  • Khóa chỉ có điểm thì người bằng điểm giữ thứ tự nhập — cũng sai khi mã nhỏ nhập sau.
  • Xếp hạng trên điểm đã làm tròn: 8,48 và 8,50 cùng là 8,5, nên phân thứ tự bằng mã.
  • ds = ds.sort() làm ds thành None; dùng sorted() để có danh sách mới.
  • Đừng đổi mã sang int: mã 00012345 sẽ in thành 12345.

Nguồn trong sách: Bài XS-05, mục 6.9, giáo trình Lập trình cơ sở với Python — TS. Nguyễn Quốc Long · Mức: XS (bài toán xuyên suốt, phần 5/8)


Đang tải...