Thông tin
Sau đây là lời giải của Đề 2 trong chuỗi đề ôn tập TS10 & THTB 2025.
Bạn đọc có thể nộp và chấm bài TẠI ĐÂY
Chuẩn bị bởi team Logica, thuộc khuôn khổ dự án The Algitect (ALGI Project)
Mô phỏng lại cuộc truy đuổi bằng cách đặt hai biến tượng trưng cho vị trí của rô-bốt và kẻ trộm. Sau mỗi giây, thay đổi hai vị trí này và kiểm tra khoảng cách.
Độ phức tạp thời gian: .
Nhận xét
Vì nên ta có là ước của .
Thử duyệt qua mọi cặp ước của , kiểm tra cặp số có thỏa mãn điều kiện không, sau đó lấy đáp án nhỏ nhất.
Độ phức tạp thời gian: .
Nhận xét
Vì nên ta có là bội của , viết lại thành:
Với là các số nguyên dương.
Lại có:
Như vậy, nếu không chia hết cho thì không tồn tại đáp án thỏa mãn, ngược lại ta có và là ước của đồng thời .
Duyệt các cặp bằng cách duyệt qua các ước của , tính , và , sau đó kiểm tra điều kiện
Độ phức tạp thời gian: .
Bài toán này chỉ kiểm tra khả năng sử dụng kiểu dữ liệu xâu.
Chữ số và kí tự
Cần phải hiểu, trong kiểu dữ liệu xâu, kí tự 9
khác với giá trị số 9. Ký tự này mang một giá trị mã ASCII để thực hiện tính.
VD:
9
= trong bảng mã ASCII.
A
= trong bảng mã ASCII.
Để thao tác với số 9
, ta cần lấy giá trị của nó bằng cách lấy kí tự 9
- 0
:
9
= trong bảng mã ASCII.0
= trong bảng mã ASCII.9
- 0
= = .Nguyên lí này dựa vào việc các số
0
,1
,2
, …,9
được sắp xếp liền kề và tăng dần trong bảng mã ASCII, có giá trị từ đến
Trong bảng mã ASCII, các chữ cái in hoa A
, B
, …, C
được xếp liền kề nhau. Do đó, khi dịch các chữ cái ta chỉ việc cộng thêm vào ký tự một khoảng cần dịch.
Lưu ý
Ta cần mô phỏng việc xoay vòng bảng chữ cái (khi hết ký tự Z
thì quay lại kí tự A
).
Dễ dàng thực hiện điều này bằng câu lệnh điều kiện.
Độ phức tạp thời gian: với là độ dài xâu.
Với , ta thử mọi cặp vị trí để mở trạm.
Giả sử ta mở hai trạm , ta có:
Để dễ xử lý, nhất là trường hợp thứ hai, đoạn bị cắt ra làm hai phần (cuối mảng và đầu mảng), thì ta thực hiện nhân đôi mảng ban đầu. Khi đó, vị trí cũng tương ứng với vị trí
Tính nhanh tổng quãng đường
Để tính nhanh được giá trị này, ta cần lưu hai mảng cộng dồn như sau:
Khi đó, từ trạm , tổng chi phí để đến các trạm là:
Độ phức tạp thời gian:
Bài toán con
Xét bài toán đơn giản hơn như sau:
Cho trạm xe buýt xếp thành một hàng thẳng được đánh số từ đến từ trái sang phải. Từ trạm chỉ có thể đi đến trạm . Chỉ có trạm được mở, mỗi trạm có chỉ tiêu hành khách. Tìm tổng quãng đường ít nhất các hành khách phải di chuyển mà vẫn đạt chỉ tiêu.
Bản chất, bài toán này là bài toán chia đoạn thành nhóm liên tiếp. Trong đó, để ghép một đoạn liên tiếp thành một nhóm sẽ mất chi phí là tổng quãng đường để các hành khách xuất phát từ trạm và đến trạm .
Đó là:
Để tính chi phí này nhanh cho nhiều đoạn, có thể áp dụng mảng cộng dồn như subtask trước, hoặc duyệt ngược và duy trì tổng hậu tố (xem code để rõ hơn).
Nếu xem xét kỹ, để giải bài toán gốc, ta chỉ cần giải bài toán con như trên với vị trí bắt đầu lần lượt là . Sau đó lấy đáp án nhỏ nhất.
VD: Với = 5. Đặt vị trí bắt đầu là , ta có trạm xe buýt thẳng hàng là:
SAU ĐÂY LÀ HƯỚNG DẪN GIẢI BÀI TOÁN CON
Áp dụng quy hoạch động.
Định nghĩa: là tổng quãng đường nhỏ nhất các hành khách phải đi thỏa mãn trạm đều đạt chỉ tiêu, khi đã mở cửa trạm, và trạm đầu tiên đạt chỉ tiêu.
Khởi gán:
Công thức:
Kết quả: : Mở cửa trạm, và cả trạm đều đạt chỉ tiêu.
Độ phức tạp thời gian: