Olympic lớp 11 HCM 04.2015: Thả diều¶
Viết chương trình xếp hạng cho các con diều.
Bài toán trích từ đề thi Olympic Thành phố tháng 04.2015 dành cho lớp 11.
Đề bài¶
Cách giải đề xuất¶
Ý tưởng chính¶
Ứng với một con diều được mới vừa thả, ta chèn độ cao của con diều này vào vị trí thích hợp của mảng độ cao giảm dần, và thứ hạng của con diều này sẽ là thứ hạng của con diều cao hơn nó cộng thêm 1.
Bước 1¶
Gọi:
-
mảng
heightDesc
là mảng độ cao giảm dần. Trong đó, mỗi phần tử là một cặp số gồm độ cao và thứ hạng. -
mảng
ranks
là mảng các thứ hạng dùng để in ra tập tin output.
Khởi tạo:
-
mảng
heightDesc
bằng cách nạp vào độ cao của con diều thả đầu tiên và thứ hạng 1. -
mảng
ranks
bằng cách nạp vào thứ hạng 1 của con diều đầu tiên.
Bước 2¶
Dùng vòng lặp duyệt độ cao của những con diều sẽ được thả tiếp theo, đồng thời thực hiện tương tự thuật toán sắp xếp chèn (insertion sort) với thứ tự giảm dần.
Nói cách khác, ta tìm cách chèn một con diều vừa thả vào vị trí phù hợp sao cho mảng heightDesc
luôn đảm bảo giảm dần.
Bước 2.1¶
Thêm con diều vừa thả vào cuối mảng heightsDesc
.
Bước 2.2¶
Xét những con diều đứng trên, cho những con diều mà có độ cao nhỏ hơn hạ xuống một vị trí.
Cụ thể hơn, đó là tìm vị trí j
của con diều có độ cao lớn hơn con diều vừa thả.
Bước 2.3¶
Chèn con diều vừa thả vào vị trí j + 1
, tức đứng trên nó chỉ gồm những con diều có độ cao lớn hơn.
Toàn bộ chương trình¶
Code đầy đủ được đặt tại GitHub.