2024-2025 Lâm Đồng¶
Câu 1: Tam giác¶
Đề bài¶
Cho toạ độ bốn điểm A, B, C và M trên hệ trục toạ độ Oxy.
Điểm M được gọi là thuộc tam giác ABC nếu M nằm trên các cạnh hoặc miền trong của tam giác ABC.
Yêu cầu: xác định điểm M có thuộc tam giác ABC hay không.
Input: file TAMGIAC.INP
Gồm bốn dòng, mỗi dòng có hai số thực cách nhau một khoảng trắng lần lượt là toạ độ của các điểm A, B, C, M.
Output: file TAMGIAC.OUT
Gồm một số duy nhất 0 hoặc 1: nếu M thuộc tam giác ABC thì kết quả là 1, ngược lại là 0.
Ví dụ:
TAMGIAC.INP | TAMGIAC.OUT |
---|---|
0.0 5.0 0.0 0.0 5.0 0.0 2.0 3.0 |
1 |
Bài giải đề xuất¶
Ý tưởng chính là kiểm tra xem tổng diện tích của ba tam giác con ABM, BCM và CAM có bằng diện tích tam giác cha ABC hay không.
Bước 1: Viết hàm tính diện tích tam giác
Diện tích tam giác được tính theo công thức:
Bước 2: Kiểm tra diện tích
Viết hàm kiểm tra nếu tổng diện tích ba tam giác con bằng diện tích tam giác cha thì M thuộc tam giác ABC.
Vì dữ liệu là số thực nên ta không thể so sánh bằng ==
mà cần so sánh với một ngưỡng nhỏ \(\epsilon\) (epsilon). Trong đó, đặt \(\epsilon = 10^-9\).
Mã nguồn¶
Code đầy đủ được đặt tại GitHub.
Câu 2: Xây tháp¶
Đề bài¶
Tại vương quốc A, có một nàng công chúa xinh đẹp được rất nhiều người yêu mến, nên vào dịp sinh nhật trăng tròn của mình, công chúa được tặng n món quà hình hộp chữ nhật. Các hộp quà được tặng lần lượt theo thứ tự từ 1 đến n.
Vì quy cách tặng quà nên các hộp quà này có cùng độ dài và độ cao, chỉ khác nhau ở độ rộng (gọi độ rộng là r). Mỗi hộp quà được sơn bởi một trong hai màu xanh hoặc đỏ.
Người hầu của công chúa được giao nhiệm vu nhận quà nên cần phải thực hiện xếp chúng thành tháp quà cao nhất có thể, theo yêu cầu sau:
- Mỗi tầng chỉ xếp một hộp quà.
- Không xoay chiều các hộp quà.
- Đặt hộp quà thứ i lên trên hộp quà thứ j thì độ rộng của hộp quà i phải nhỏ hơn độ rộng của hộp quà j.
- Hai hộp quà xếp chồng kề nhau phải có màu sắc khác nhau.
Yêu cầu: hãy chọn nhiều nhất các hộp quà để xếp chúng thành tháp quà thoả mãn các điều kiện trên.
Input: file XAYTHAP.INP
-
Dòng đầu tiên ghi số \(n (n \le 500000)\)
-
Dòng tiếp theo ghi \(n\) số \(r_1, r_2, ..., r_n (-10^9 \le r_i \le 10^9)\). Trong đó \(r_i > 0\) là khối màu đỏ, \(r_i < 0\) là khối màu xanh, \(| ri |\) là độ rộng của hộp quà thứ \(i\).
Output: file XAYTHAP.OUT
Gồm một số nguyên là số lượng hộp quà nhiều nhất có thể xây được.
Ví dụ:
XAYTHAP.INP | XAYTHAP.OUT |
---|---|
5 7 -2 6 9 -3 |
2 |
11 -9 2 5 18 17 -15 4 |
5 |
Bài giải đề xuất¶
Bước 0: Đọc dữ liệu từ file .inp
Tạo mảng một chiều G để lưu thông tin các hộp quà. Mỗi phần tử là một cặp giá trị \((r, color)\).
Bước 1: Sắp xếp mảng G theo thứ tự độ rộng giảm dần.
Bước 2: Điền bảng quy hoạch động
Khởi tạo mảng hai chiều D
. Trong đó, D[i][c]
là số hộp quà nhiều nhất tại vị trí i
và có màu c
.
Giả sử ta đang đứng ở hộp quà j
. D[j][c]
lưu số hộp quà nhiều nhất tính từ hộp đầu tiên đến hộp thứ j
và có màu c
.
Bây giờ ta xét hộp quà i
tiếp theo sau j
xem có thể đặt hộp quà i
lên hộp quà j
hay không.
Điều kiện để hộp quà i
được đặt lên hộp quà j
là:
1. Độ rộng của hộp quà i
nhỏ hơn độ rộng của hộp quà j
.
2. Màu của hộp quà i
khác màu của hộp quà j
.
Nếu thỏa mãn điều kiện trên thì ta cập nhật lại số hộp quà nhiều nhất tại vị trí i
.
Mã nguồn¶
Code đầy đủ được đặt tại GitHub.
Câu 3: Xâu đối xứng¶
Đề bài¶
Cho một xâu S tối đa \(10^6\) ký tự.
Xâu con của xâu S là một dãy các ký tự liên tiếp nhau trong S.
Xâu đối xứng là xâu đọc từ trái qua phải hay đọc từ phải qua trái đều giống nhau, chẳng hạn như các xâu 'a', 'abba', 'abcdcba'.
Yêu cầu: tìm số nguyên k là độ dài của xâu con đối xứng dài nhất trong xâu S.
Input: file XDXUNG.INP
Xâu S.
Output: file XDXUNG.OUT
Một số nguyên k là độ dài của xâu con đối xứng dài nhất của xâu S.
Ví dụ:
XDXUNG.INP | XDXUNG.OUT |
---|---|
Abcbcadk % | 3 |
abcccccbbbbdddkh | 7 |
Bài giải đề xuất¶
Bài toán này có thể giải bằng thuật toán Manacher hoặc quy hoạch động.
Phần trình bày dưới đây dùng quy hoạch động. Ý tưởng chính là: một chuỗi được xem là đối xứng khi ký tự đầu tiên và ký tự cuối cùng giống nhau và chuỗi con còn lại bên trong cũng là đối xứng.
Bước 0 Khởi tạo
Khởi tạo mảng hai chiều D
có kích thước n x n
với n
là độ dài của xâu s
.
Trong đó, D[i][j]
lưu giá trị true
hoặc false
biểu thị chuỗi con s[i..j]
là đối xứng hay không (bắt đầu từ i
và kết thúc tại j
).
Vì chuỗi con gồm một ký tự là đối xứng nên D[i][i] = 1
.
Nếu hai ký tự liên tiếp giống nhau thì chuỗi con hai ký tự này cũng là đối xứng, nên D[i][i + 1] = 2
.
Bước 1: Điền bảng quy hoạch động
Lần lượt xét các chuỗi con có độ dài từ 3 trở lên.
Điều kiện để các chuỗi con này đối xứng là:
1. Ký tự đầu tiên i
và ký tự cuối j
phải giống nhau.
2. Chuỗi con nằm giữa s[i+1..j-1]
phải là đối xứng.
Nếu thỏa mãn hai điều kiện trên thì ta cập nhật lại độ dài chuỗi con đối xứng dài nhất.
Mã nguồn¶
Code đầy đủ được đặt tại GitHub.
Câu 4: Bữa tiệc¶
Đề bài¶
Công ty XYZ có N người được tổ chức theo sơ đồ hình cây: node K là cha của node L nghĩa là K là cấp trên của L. Ông giám đốc là gốc. Nhân viên thứ \(i\) có độ vui vẻ \(h_i (-128 < h_i < 127)\).
Ông giám đốc muốn tổ chức một bữa tiệc có tổng độ vui vẻ là lớn nhất và nếu có một nhân viên nào đó đi dự thì sẽ không có cấp trên trực tiếp của anh ta. Đương nhiên ông giám đốc phải có mặt.
Yêu cầu: hãy giúp ông giám đốc tìm độ vui vẻ lớn nhất.
Input: file BUATIEC.INP:
- Dòng đầu ghi số nguyên dương \(N (1 < N < 2025)\)
- Dòng thứ hai ghi \(N\) số \(h_1, h_2, ..., h_N (-128 < h_i < 127)\)
- \(N - 1\) dòng còn lại ghi hai số \(L\) và \(K\).
Output: file BUATIEC.OUT
Một số nguyên là tổng độ vui vẻ lớn nhất tìm được.
Ví dụ:
BUATIEC.INP | BUATIEC.OUT |
---|---|
7 1 1 1 1 1 1 1 2 1 3 1 4 2 6 2 5 3 7 3 |
5 |
Bài giải đề xuất¶
Ý tưởng chính là sử dụng quy hoạch động.
Để lưu dữ liệu input, ta dùng danh sách kề adj
(adjacent list), với adj[k]
chứa các đỉnh (nhân viên) cấp dưới của k
.
Mảng hai chiều D
có kích thước n x 2
với n
là số nhân viên, bao gồm giám đốc.
Trong đó:
D[i][0]
là tổng độ vui vẻ lớn nhất khi không chọn nhân viêni
-D[i][1]
là tổng độ vui vẻ lớn nhất khi chọn nhân viêni
.
Để điền bảng quy hoạch động, ta duyệt từ gốc đến lá theo kỹ thuật duyệt DFS.
Bước 1: Viết hàm duyệt bằng DFS và điền bảng quy hoạch động
Bước 2: Gọi hàm dfs()
với node truyền vào là 1
, ứng với giám đốc.
Mã nguồn¶
Code đầy đủ được đặt tại GitHub.