Câu 1. Chẵn lẻ
CHANLE.CPP
Cho một dãy số. Hãy in ra tất cả các số lẻ trước, sau đó đến tất cả các số chẵn trên cùng một dòng. Các số lẻ phải ở thứ tự ngược lại so với dãy ban đầu, còn các số chẵn vẫn giữ nguyên thứ tự.
Gợi ý: nếu số lẻ thì push_front, nếu số chẵn thì push_back.
Câu 2. Giá trị nhỏ nhất trong mỗi đoạn
MINRANGE.CPP
Cho dãy A gồm N phần tử và số nguyên dương k. Với mỗi vị trí i từ k đến N, hãy tìm giá trị nhỏ nhất trong đoạn từ i-k+1 đến i.
MINRANGE.INP
8 4
1 3 5 7 4 5 9 5
Gợi ý: dùng deque lưu chỉ số sao cho giá trị trong deque tăng dần. Phần tử đầu deque là min của cửa sổ hiện tại.
Câu 3. Rồng thần
RONGTHAN.CPP
Rồng thần có thể phun lửa tối đa N lần, sát thương lần i là A[i]. Tuy nhiên, rồng không thể phun lửa K lần chí mạng liên tiếp. Hãy tính tổng sát thương lớn nhất có thể gây ra.
RONGTHAN.INP
7 3
1 4 2 3 6 5 9
Gợi ý: Có thể quy về chọn bỏ một số vị trí sao cho không có K vị trí liên tiếp đều được chọn. Dùng DP và tối ưu bằng deque cho cửa sổ.
Câu 4. Hai khóm hoa
HAIHOA.CPP
Cho luống hoa gồm N bông theo thứ tự, mỗi bông có độ xinh đẹp. Chọn hai khóm hoa rời nhau, mỗi khóm gồm các bông liên tiếp, sao cho trong mỗi khóm chênh lệch độ xinh đẹp giữa hai bông bất kỳ không quá K. Hãy chọn được nhiều bông nhất.
Gợi ý: Với mỗi đầu/phải cửa sổ, dùng hai deque để duy trì min và max, đảm bảo max-min ≤ K. Sau đó kết hợp hai đoạn rời nhau bằng mảng prefix/suffix.
Câu 5. Dạy học quanh bàn tròn
DAYHOC.CPP
Lớp có N học sinh ngồi quanh bàn tròn. Thầy chọn một học sinh bắt đầu, sau đó đi theo chiều kim đồng hồ, mỗi bạn được hướng dẫn đúng Δ giây. Học sinh thứ i sau khi được hướng dẫn cần thêm A[i] giây để viết xong chương trình. Hãy chọn vị trí bắt đầu để thời gian tất cả hoàn thành là nhỏ nhất.
Dãy A không nhập trực tiếp mà được xác định bởi công thức: A[i] = (p * i) mod m + q.
Gợi ý: Nhân đôi dãy để xử lý vòng tròn. Với mỗi vị trí bắt đầu, thời gian hoàn thành là max của dạng A[j] + thứ_tự_hướng_dẫn·Δ trong một cửa sổ dài n. Có thể dùng deque để lấy max cửa sổ hiệu quả.