2024-2025 Tuyên Quang¶
Câu 1: TÍNH TỔNG¶
Đề bài¶
Cho dãy A gồm n phần tử
Dữ liệu: TINHTONG.INP
- Dòng đầu tiên chứa số nguyên dương n
. - Dòng thứ hai chứa n số nguyên
.
Kết quả: TINHTONG.OUT
Ví dụ:
TINHTONG.INP | TINHTONG.OUT |
---|---|
5 15 141 28 66 79 |
122 |
Ràng buộc:
- Có 40% số test tương ứng với 40% số điểm của bài có
. - Có 30% số test tương ứng với 30% số điểm của bài có
. - Có 30% số test tương ứng với 30% số điểm của bài có
.
Bài giải đề xuất¶
Mã nguồn¶
Code đầy đủ được đặt tại GitHub.
Câu 2: TƯƠNG ĐỒNG¶
Đề bài¶
Gia đình Thỏ con vừa xây xong một căn nhà khang trang. Công việc tiếp theo là hoàn thiện nội thất. Thỏ con được bố mẹ giao nhiệm vụ tìm mua hai bức tranh để trang trí phòng khách.
Tại cửa hàng, có tất cả
Thỏ con muốn mua hai bức tranh sao cho màu sắc của chúng tương đồng nhau, tức hiệu số mã màu của hai bức tranh đó phải không lớn hơn
Yêu cầu: hãy cho biết Thỏ con có bao nhiêu cách chọn ra hai bức tranh để mua mà màu sắc tương đồng nhau.
Dữ liệu: TUONGDONG.INP
- Dòng đầu tiên chứa hai số nguyên dương
. - Dòng thứ hai chứa
số nguyên dương .
Kết quả: TUONGDONG.OUT
Một số nguyên duy nhất là số cách chọn ra hai bức tranh để mua thoả mãn yêu cầu.
Ví dụ:
TUONGDONG.INP | TUONGDONG.OUT |
---|---|
4 3 5 6 9 2 |
3 |
Giải thích:
Có 3 cách chọn sau:
- Chọn tranh 1 và 2
- Chọn tranh 1 và 4
- Chọn tranh 2 và 3
Ràng buộc:
- Có 40% số test tương ứng với 40% số điểm của bài có
. - Có 30% số test tương ứng với 30% số điểm của bài có
. - Có 30% số test tương ứng với 30% số điểm của bài có
.
Bài giải đề xuất¶
Ý tưởng chính:
Sắp xếp mảng pictures
chứa các mã màu của dữ liệu đầu vào theo thứ tự tăng dần.
Giả sử ta đang chọn bức tranh i
có mã màu là pictures[i]
.
Như vậy, số cách chọn hai bức tranh (mà trong đó đã chọn bức tranh i
) chính là số cách chọn bức tranh thứ hai j
sao cho pictures[j] \le pictures[i] + X
.
Để xác định vị trí j
, trong C++, ta dùng hàm upper_bound()
để tìm vị trí đầu tiên lớn hơn pictures[i] + X
.
Mặc định trong Python không có hàm upper_bound()
, cho nên ta dùng vòng lặp while để xác định vị trí j
.
Mã nguồn¶
Code đầy đủ được đặt tại GitHub.
Câu 3: TRÒ CHƠI¶
Đề bài¶
Nhân dịp đầu năm mới, Đoàn Thanh niên tổ chức chương trình khai xuân cho học sinh chơi các trò chơi. Có tất cả
Có tất cả
Yêu cầu: kết thúc chương trình, ban tổ chức muốn biết
Dữ liệu: TROCHOI.INP
- Dòng đầu tiên chứa ba số nguyên dương
. - Dòng thứ i trong k dòng tiếp theo chứa hai số nguyên dương
. - Dòng cuối cùng chứa
số nguyên dương .
Kết quả: TROCHOI.OUT
Dòng thứ
Ví dụ:
TROCHOI.INP | TROCHOI.OUT |
---|---|
10 2 3 3 9 8 9 6 8 2 |
1 2 0 |
Ràng buộc:
- Có 40% số test tương ứng với 40% số điểm của bài có
. - Có 30% số test tương ứng với 30% số điểm của bài có
. - Có 30% số test tương ứng với 30% số điểm của bài có
.
Bài giải đề xuất¶
Ý tưởng chính: vì số lượng học sinh lên đến
Bước 0: Khai báo biến
Khai báo mảng chênh lệch diff
và mảng tần số kết quả join
.
Để tiết kiệm bộ nhớ, trong C++, ta sử dụng kiểu map
. Đặc điểm của map
là tự động sắp xếp các phần tử theo thứ tự tăng dần của khóa.
Trong Python, ta sử dụng kiểu dict
. Đặc điểm của dict
là không sắp xếp các phần tử theo thứ tự tăng dần của khóa. Cho nên, ta cần gọi hàm để sắp xếp lại.
Bước 1: Đọc và khởi tạo
Vừa đọc các dữ liệu đầu vào vừa cập nhật mảng chênh lệch diff
.
Bước 2: Xử lý
Tính mảng cộng dồn join
(join[i]
là số lần tham gia của học sinh i
) từ mảng chênh lệch diff
.
Bước 3: In kết quả
Để tránh trường hợp không có học sinh cần truy vấn trong mảng join
, trong C++, ta dùng upper_bound()
để lấy giá trị gần nhất.
Trong Python, ta sắp xếp lại mảng join
và dùng hàm next()
để lấy giá trị gần nhất.
Mã nguồn¶
Code đầy đủ được đặt tại GitHub.
Câu 4: ĐƯỜNG ĐI NGUYÊN TỐ¶
Đề bài¶
Cho một đồ thị vô hướng, liên thông gồm
Cạnh thứ
Yêu cầu: hãy tìm một đường đi từ đỉnh
Dữ liệu: DDNT.INP
- Dòng thứ nhất: gồm bốn số nguyên dương
. - Dòng thứ
trong dòng sau chứa ba số nguyên dương .
Kết quả: DDNT.OUT
Một số nguyên duy nhất là tổng giá trị tăng nhỏ nhất của các cạnh tìm được.
Ví dụ:
DDNT.INP | DDNT.OUT |
---|---|
4 5 1 4 1 2 20 1 3 3 2 4 10 3 4 6 1 4 15 |
1 |
Giải thích:
Đường đi từ đỉnh 1 đến đỉnh 4 là: 1 - 3 - 4
Cạnh 1 - 3: trọng số là 3. Tăng 0. (3 + 0 = 3 là nguyên tố)
Cạnh 3 - 4: trọng số là 6. Tăng 1. (6 + 1 = 7 là nguyên tố)
Tổng giá trị tăng là: 0 + 1 = 1.
Ràng buộc:
- Có 20% số test tương ứng với 20% số điểm của bài có
. - Có 40% số test tương ứng với 40% số điểm của bài có
. - Có 40% số test tương ứng với 40% số điểm của bài có
.
Bài giải đề xuất¶
Ý tưởng chính là áp dụng thuật toán Dijkstra để tìm đường đi ngắn nhất từ đỉnh
Cần chú ý, khoảng cách nhỏ nhất không phải được tính từ trọng số các cạnh trong dữ liệu đầu vào, mà được tính từ các giá trị tăng để đạt được số nguyên tố.
Do đó, ta cần viết riêng một hàm để tính giá trị tăng này.
Để kiểm tra số nguyên tố trong phạm vi
Bước 1:
Tạo sàng Eratosthenes từ 1 đến 1 triệu lẻ 3, vì đây là số nguyên tố đầu tiên lớn hơn
Bước 2:
Viết hàm tính giá trị tăng để đạt được số nguyên tố tiếp theo lớn hơn w
.
Bước 3:
Thực hiện thuật toán Dijkstra. Trong đó, ta thường xuyên cập nhật mảng D
khoảng cách ngắn nhất từ đỉnh xuất phát đến các đỉnh khác.
Khoảng cách ngắn nhất lưu trong mảng D
này được tính từ các giá trị tăng (để đạt được số nguyên tố), chứ không phải tình từ các trọng số của cạnh.
Mã nguồn¶
Code đầy đủ được đặt tại GitHub.