Thông tin
Sau đây là lời giải của Đề 1 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)
Trong trường hợp , tồn tại vô số giá trị thỏa mãn đề bài.
Nhận xét
Giá trị tối đa có thể đạt được là .
Vì với thì .
Trong subtask này, ta thử từng giá trị từ đến , với mỗi giá trị như vậy ta duyệt qua mảng để kiểm tra giá trị đó có hợp lệ hay không.
Độ phức tạp thời gian: .
Ta phân tích yêu cầu đề bài:
Như vậy, chính là ước chung của .
Hay nói cách khác, cũng là ước của:
Sau khi tính được giá trị , ta thực hiện duyệt đến để thu được các giá trị .
Để in ra tăng dần, ta chia thao tác duyệt ước thành bước:
Độ phức tạp thời gian: .
tượng trưng cho độ phức tạp thời gian của lệnh
__gcd()
của C++.
Bài toán thực chất là tìm độ dài đoạn con ngắn nhất có tổng lớn hơn hoặc bằng .
Duyệt từ đến để cố định vị trí bắt đầu của một đoạn con. Sau đó, khởi tạo biến , tăng dần biến để mở rộng đoạn con bắt đầu tại .
Đồng thời duy trì một biến tổng để lưu tổng của đoạn con . Nếu , ta lấy độ dài đoạn để cực tiểu hóa kết quả.
Độ phức tạp thời gian:
Nhận xét
Vì mảng dương nên với một đoạn bất kì ta có:
Do đó, có thể áp dụng kỹ thuật hai con trỏ, khéo léo dịch chuyển hai đầu của đoạn để tìm các đoạn có độ dài nhỏ nhất thỏa mãn tổng đạt ít nhất bằng .
Cụ thể:
Độ phức tạp thời gian: .
Đề bài đảm bảo với , nghĩa là luôn có cách để con bò đạt lượng sữa đúng bằng chỉ với thao tác cho ăn cỏ hoặc cho ăn ngũ cốc.
Vì vậy, chỉ cần in ra .
Độ phức tạp thời gian: .
Áp dụng quy hoạch động.
tức là có thể tạo được lượng sữa i.
tức là không thể tạo được lượng sữa i.
Nếu đã tạo được lượng sữa , có thể cho bò ăn thêm cỏ để đạt lượng sữa .
Tương tự với .
Nếu đã tạo được lượng sữa mà không cần vắt, ta có thể thực hiện vắt sữa lúc này để đạt lượng sữa .
Cách áp dụng công thức quy hoạch động
Dễ thấy, trong hai công thức ở trên:
Do đó, rất khó để quy hoạch động bằng cả hai công thức cùng một lúc.
Nhận xét rằng chỉ bị tác động bởi , do đó ta thực hiện tính trước bằng công thức quy hoạch động đầu tiên.
Sau đó thực hiện tính sơ bộ bằng công thức thứ hai, áp dụng các giá trị đã có.
Tuy nhiên, các giá trị chỉ đang mô phỏng chuỗi thao tác kết thúc bằng việc vắt sữa.
Do đó ta tiếp tục sử dụng công thức thứ nhất (mô phỏng việc tiếp tục cho bò ăn) để cập nhật .
Độ phức tạp thời gian: .
Nhận xét
Từ một điểm, ta tìm cách đi đến các điểm tiếp theo (tức là thỏa mãn thứ tự gốc của đề bài) ở vị trí gần đó nhất.
Xem xét điều kiện của subtask 1:
Điều kiện trên mô tả:
Do đó, nếu ta duyệt các điểm từ trái sang phải trên trục , ta cũng đang thực hiện duyệt theo đúng thứ tự thỏa mãn đề bài, đồng thời đảm bảo chi phí di chuyển là nhỏ nhất.
Ta chỉ cần quan tâm tại một tọa độ trên trục có tồn tại điểm nào không, dễ dàng làm được điều này bằng cách sử dụng cấu trúc dữ liệu map
.
Hoặc sử dụng mảng thường và tịnh tiến lên để lưu các chỉ số trong đoạn
Độ phức tạp thời gian:
Thao tác trên
map
mất
Áp dụng quy hoạch động.
Định nghĩa:
Khởi gán:
Công thức:
Kết quả: : Đi hết các điểm, và kết thúc tại điểm thu thập thông tin thứ .
Độ phức tạp thời gian: