Tutorial
A. Phép Cộng
Hint: Đọc hai số nguyên A, B từ stdin, in ra A + B vào stdout.
Giải thích: Bài khởi động I/O: dữ liệu vào cùng dòng, cách nhau bởi dấu cách; chỉ được dùng chuẩn nhập/xuất, không in thêm chữ. Với ràng buộc nhỏ (0 ≤ A, B ≤ 10) nên không lo tràn số, cũng không cần xử lý định dạng đặc biệt
B. Nước đi của quân Xe
Hint:
- Bàn cờ 8×8, ô ký hiệu “cột a..h + hàng 1..8” (ví dụ e5).
- Với vị trí cột = c, hàng = r của quân Xe, liệt kê mọi ô:
- Cùng cột c: c1..c8, bỏ cr.
- Cùng hàng r: a r .. h r, bỏ cr.
- In đúng định dạng “chữ + số”. Thứ tự tùy ý (trừ khi đề yêu cầu khác).
Giải thích chi tiết:
- Chuyển chữ cột (‘a’..‘h’) sang chỉ số 1..8 (hoặc làm việc trực tiếp với ký tự).
- Duyệt 8 hàng để lấy các ô theo cột; duyệt 8 cột để lấy các ô theo hàng.
- Bỏ trùng chính ô hiện tại.
- Không có quân cản, nên mọi ô cùng hàng/cột đều hợp lệ.
- Độ phức tạp O(8 + 8) cho mỗi test (hằng số).
Lưu ý dễ sai:
- Đừng in lại ô ban đầu.
- Giữ đúng chữ thường cho cột (a..h) và số hàng (1..8).
C. Món quà sinh nhật
Bài toán: Có dãy chữ số a1..an (0..9). Ta được chọn đúng một chữ số để cộng thêm 1. Hỏi tích lớn nhất đạt được sau thao tác đó.
Hint chiến lược:
1. Nếu có ≥ 2 số 0: Dù cộng 1 cho một trong số đó, vẫn còn ít nhất một số 0 → tích = 0.
2. Nếu có đúng 1 số 0: Tốt nhất là tăng số 0 lên 1. Tích khi đó = tích của các phần tử khác (vì 0→1).
3. Nếu không có số 0: ta muốn chọn phần tử i để nhân tích với hệ số . Hệ số này càng lớn khi
càng nhỏ. Vậy chỉ cần chọn chữ số nhỏ nhất trong dãy để +1.
Giải thích toán học ngắn:
- Tích sau khi tăng vị trí i:
(nếu
).
- Với chữ số 1..9,
giảm dần theo a (ví dụ 2.0, 1.5, 1.33…, 1.11…).
- Trường hợp có 0 cần tách riêng vì công thức trên không áp dụng (chia cho 0).
Bẫy:
- Tăng số 9 thành 10 là hợp lệ (đề không cấm), và thường rất tốt khi mọi chữ số đều là 9 → kết quả =
.
- Tích có thể lớn: dùng kiểu số lớn (nhưng ở đây bạn chỉ viết ý tưởng, không code).
D. Trò chơi 1
Mô tả rút gọn: Hai người lần lượt cộng hoặc trừ 1 vào n; Nhi đi trước. Chơi tối ưu. (Giới hạn “10 lượt” về bản chất không ảnh hưởng kết quả chiến lược.) Hỏi ai thắng.
Kết luận nhanh:
Kết quả phụ thuộc vào n mod 3:
- Nếu
⇒ Second thắng.
- Ngược lại ⇒ First thắng.
Vì sao đúng (trực giác ngắn):
- Các vị trí mà người sắp đi thua là bội số của 3. Từ đó, mọi nước đi (±1) đều đưa đối phương đến trạng thái
, và đối phương có thể ngay lập tức đẩy lại về bội số của 3, duy trì bất lợi cho bạn.
- Nếu ban đầu
, First có thể đi một bước để biến n thành bội số của 3, đẩy Second vào thế thua.
Cách kiểm:
- Thử vài giá trị: 1→First, 2→First, 3→Second, 4→First, 5→First, 6→Second, v.v.
E. Cuộc họp
Bài toán: Có N người phát biểu, mỗi người nói bằng nhau x phút, giữa hai người liên tiếp nghỉ 1 phút. Tổng thời lượng không vượt quá K phút. Hãy tìm x lớn nhất (x là số nguyên, và ít nhất 1 phút).
Công thức:
- Tổng thời gian =
(vì có N−1 khoảng nghỉ).
- Điều kiện:
.
- Suy ra:
.
(Theo đề, nên giá trị trong ngoặc luôn ≥1; viết
chỉ để nhấn mạnh ràng buộc “ít nhất 1 phút”.)
Bẫy:
- Đừng quên N−1 phút nghỉ.
- Lấy floor (chia lấy phần nguyên xuống).
- I/O: N và K nằm ở hai dòng khác nhau.
F. Cần 9 số 0
Hint:
Duyệt từng phần tử trong dãy, kiểm tra xem giá trị (a[i] + 9) có tồn tại trong dãy ban đầu hay không.
- Nếu không tồn tại, tăng biến đếm kết quả lên 1.
- Nếu tồn tại, bỏ qua.
Có thể dùng STL set/map hoặc sắp xếp + tìm kiếm nhị phân để kiểm tra nhanh.
Giải thích:
- Ta cần xác định số phần tử mà “sau khi cộng 9” không còn xuất hiện trong dãy.
- Ví dụ: dãy [1, 10, 19] →
- 1+9=10 (có),
- 10+9=19 (có),
- 19+9=28 (không có) ⇒ kết quả = 1.
Độ phức tạp:
- Dùng set hoặc sắp xếp → tìm kiếm nhị phân mỗi phần tử: O(n log n).