C6-14 · Hóa đơn quán ăn

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

Đề

Một bàn ăn gọi ~n~ món. Với mỗi món biết tên, đơn giá (nghìn đồng) và số lượng; thành tiền = đơn giá × số lượng. Lưu mỗi món thành tuple (ten_mon, thanh_tien), rồi in hóa đơn:

  • các món theo thành tiền giảm dần; món bằng thành tiền thì theo tên tăng dần (so chuỗi như Python);
  • dòng cuối là tổng tiền.

Sắp xếp bằng sorted(..., key=...) với hàm khóa viết bằng def (như khoa_xep_hang của XS-05, mục 6.9).

Dữ liệu vào

  • Dòng 1: số nguyên ~n~.
  • ~n~ dòng tiếp theo, mỗi dòng ten_mon don_gia so_luong; tên viết liền, không dấu, chỉ gồm chữ thường a–z, chữ số và dấu _; tên các món khác nhau.

Kết quả

  • ~n~ dòng, mỗi dòng ten_mon thanh_tien, theo thứ tự đã nêu.
  • Dòng cuối: tổng tiền (số nguyên).

Ràng buộc

  • ~1 \le n \le 100~; tên dài 1 đến 30 ký tự.
  • ~1 \le~ don_gia ~\le 10^4~, ~1 \le~ so_luong ~\le 1000~ (số nguyên).

Ví dụ

Dữ liệu vào:

3
tra_da 5 3
rau_xao 30 2
canh_chua 60 1

Kết quả:

canh_chua 60
rau_xao 60
tra_da 15
135

Giải thích ví dụ

Thành tiền: tra_da ~5 \times 3 = 15~, rau_xao ~30 \times 2 = 60~, canh_chua ~60 \times 1 = 60~. Hai món cùng 60 nên xếp theo tên: "canh_chua" < "rau_xao". Tổng ~60 + 60 + 15 = 135~.

Khóa (-thanh_tien, ten_mon) cho đúng thứ tự này: thành phần đầu đổi dấu để tiền lớn đứng trước, bằng nhau mới so tên.

Lưu ý

  • reverse=True trên khóa (thanh_tien, ten_mon) đảo cả hai chiều — tên cũng bị xếp giảm. Chỉ đổi dấu phần tiền.
  • Thành tiền phải là số nguyên khi so sánh và khi in (60, không phải 60.0; so chuỗi thì "9" > "60").
  • So tên theo thứ tự chuỗi của Python: ca < ca_kho < canh, mon1 < mon10 < mon2.

Nguồn trong sách: Bài C6-14, mục 6.12, giáo trình Lập trình cơ sở với Python — TS. Nguyễn Quốc Long · Mức: (***)


Đang tải...