A. [GCC TRAINING 2026 — PRACTICE 1] Chữ Hoa chữ thường
[spoiler=Ý Tưởng] - Trong bảng mã ASCII, các chữ cái in thường ('a' đến 'z') và các chữ cái in hoa ('A' đến 'Z') được sắp xếp liên tiếp nhau. - Khoảng cách giữa chữ thường và chữ hoa tương ứng luôn là một hằng số: 'a' — 'A' = 32. - Do đó, để chuyển một ký tự thường c thành ký tự hoa, ta chỉ cần: — Lấy c — 32 (hoặc trừ đi 'a' — 'A').
[spoiler=Code] ```C++
include
using namespace std;
int main() { char c; cin >> c; c -= 32; cout << c; return 0; } ```
B. [GCC TRAINING 2026 — PRACTICE 1] Tính tiền mua hàng
[spoiler=Ý Tưởng] - Tổng số tiền cần thanh toán là tích giữa đơn giá và số lượng: $$$\text{Tổng tiền} = p \times n$$$. - Vì $$$p$$$ là số thực nên ta dùng kiểu dữ liệu double, còn $$$n$$$ là số nguyên dùng kiểu int. - Để in ra chính xác $$$2$$$ chữ số thập phân sau dấu phẩy trong C++, ta sử dụng fixed kết hợp với setprecision(2) từ thư viện <iomanip>. - Độ phức tạp thời gian: $$$O(1)$$$. - Độ phức tạp không gian: $$$O(1)$$$. [/spoiler]
[spoiler=Code] ```cpp
include
include
using namespace std;
int main() { double p; int n; cin >> p >> n; cout << fixed << setprecision(2) << p * n; return 0; } ```
C. [GCC TRAINING 2026 — PRACTICE 1] Làm tròn số
[spoiler=Ý Tưởng] - Đề bài yêu cầu tìm hai số nguyên: 1. Số nguyên lớn nhất bé hơn hoặc bằng $$$x$$$: Đây chính là định nghĩa của hàm sàn (floor), ký hiệu là $$$\lfloor x \rfloor$$$. Trong C++, ta dùng hàm floor(x) từ thư viện <cmath>. 2. Số nguyên nhỏ nhất lớn hơn $$$x$$$: Lưu ý điều kiện là lớn hơn hẳn ($$$ \gt x$$$), không phải lớn hơn hoặc bằng ($$$\ge x$$$). — Ta xét số nguyên nhỏ nhất lớn hơn hoặc bằng $$$x$$$ chính là hàm trần (ceiling) $$$\lceil x \rceil$$$, tương ứng với hàm ceil(x). — Nếu $$$x$$$ là số nguyên (ví dụ $$$x = 3.0$$$): Số nhỏ nhất lớn hơn $$$x$$$ phải là $$$x + 1$$$ (tức là $$$4$$$). Khi đó floor(x) = 3, còn số tiếp theo là floor(x) + 1 = 4. — Nếu $$$x$$$ không phải số nguyên (ví dụ $$$x = 3.2$$$): floor(x) = 3, và số nguyên nhỏ nhất lớn hơn $$$x$$$ là $$$\lceil x \rceil = 4$$$. — Như vậy, trong mọi trường hợp, số thứ hai luôn bằng floor(x) + 1. - Vì yêu cầu in theo thứ tự tăng dần, kết quả luôn là floor(x) và floor(x) + 1 (ép về kiểu số nguyên long long để in không bị dính phần thập phân). - Độ phức tạp thời gian: $$$O(1)$$$. - Độ phức tạp không gian: $$$O(1)$$$. [/spoiler]
[spoiler=Code] ```cpp
include
include
using namespace std;
int main() { double x; if (cin >> x) { long long a = floor(x); long long b = a + 1; cout << a << " " << b << "\n"; } return 0; } ```
D. [GCC TRAINING 2026 — PRACTICE 1] Tính toán cơ bản
[spoiler=Ý Tưởng] - Bài toán yêu cầu tính toán và in ra $$$7$$$ kết quả lần lượt trên từng dòng: 1. Tổng: $$$A + B$$$ 2. Hiệu: $$$A - B$$$ 3. Tích: $$$A \times B$$$ 4. Thương: $$$A / B$$$ (thực hiện phép chia số nguyên lấy phần nguyên) 5. Chia dư: $$$A \pmod B$$$ 6. $$$A^3 = A \times A \times A$$$ 7. $$$B^3 = B \times B \times B$$$ - Lưu ý về kiểu dữ liệu: — Vì $$$A, B \le 10^6$$$, khi tính $$$A \times B$$$ giá trị có thể đạt tới $$$10^{12}$$$, và $$$A^3, B^3$$$ có thể đạt tới $$$10^{18}$$$. — Do đó, nếu dùng kiểu int thông thường (chỉ chứa tối đa khoảng $$$2 \times 10^9$$$) sẽ bị tràn số. Bắt buộc phải khai báo $$$A$$$ và $$$B$$$ bằng kiểu long long. - Độ phức tạp thời gian: $$$O(1)$$$. - Độ phức tạp không gian: $$$O(1)$$$. [/spoiler]
[spoiler=Code] ```cpp
include
using namespace std;
int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);
long long a, b;
if (cin >> a >> b) {
cout << a + b << "\n";
cout << a - b << "\n";
cout << a * b << "\n";
cout << a / b << "\n";
cout << a % b << "\n";
cout << a * a * a << "\n";
cout << b * b * b << "\n";
}
return 0;} ```
E. [GCC TRAINING 2026 — PRACTICE 1] Đấu bài Magic 1
[spoiler=Ý Tưởng] - Bài toán yêu cầu so sánh giữa chỉ số tấn công của Lộc ($$$A$$$) và chỉ số phòng thủ của Kỳ ($$$D$$$). - Theo quy tắc giao chiến giữa quái thú tấn công và quái thú phòng thủ: — Nếu $$$A \gt D$$$: Quái thú của Kỳ bị tiêu diệt $$$\to$$$ In ra YASS. — Nếu $$$A \le D$$$: Quái thú của Kỳ không bị tiêu diệt $$$\to$$$ In ra NO. - Vì giới hạn $$$0 \le A, D \le 10000$$$, ta chỉ cần dùng kiểu dữ liệu số nguyên cơ bản int và một câu lệnh điều kiện if-else đơn giản. - Độ phức tạp thời gian: $$$O(1)$$$. - Độ phức tạp không gian: $$$O(1)$$$. [/spoiler]
[spoiler=Code] ```cpp
include
using namespace std;
int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);
int a, d;
if (cin >> a >> d) {
if (a > d) {
cout << "YASS\n";
} else {
cout << "NO\n";
}
}
return 0;} ```
F. [GCC TRAINING 2026 — PRACTICE 1] Hình Chữ Nhật
[spoiler=Ý Tưởng] - Một hình chữ nhật luôn có $$$4$$$ cạnh gồm $$$2$$$ cặp cạnh bằng nhau từng đôi một (hai chiều dài bằng nhau và hai chiều rộng bằng nhau). - Khi biết $$$3$$$ cạnh $$$a, b, c$$$, chắc chắn có $$$2$$$ cạnh có giá trị bằng nhau, và cạnh thứ ba còn lại sẽ là kích thước của cặp cạnh chưa đủ. Cạnh thứ tư cần tìm sẽ có độ dài bằng chính cạnh còn lại đó: — Nếu $$$a = b$$$ thì cạnh còn lại là $$$c$$$. — Nếu $$$a = c$$$ thì cạnh còn lại là $$$b$$$. — Nếu $$$b = c$$$ thì cạnh còn lại là $$$a$$$. - Mẹo tối ưu (Toán học / Bitwise): Phép toán XOR ($$$\oplus$$$) có tính chất $$$x \oplus x = 0$$$ và $$$x \oplus 0 = x$$$. Vì hai cạnh bằng nhau sẽ triệt tiêu nhau, nên kết quả cạnh còn lại chính là $$$a \oplus b \oplus c$$$. - Độ phức tạp thời gian: $$$O(1)$$$. - Độ phức tạp không gian: $$$O(1)$$$. [/spoiler]
[spoiler=Code] ```cpp
include
using namespace std;
int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);
int a, b, c;
if (cin >> a >> b >> c) {
cout << (a ^ b ^ c) << "\n";
}
return 0;} ```
G. [GCC TRAINING 2026 — PRACTICE 1] Cuối tháng của Nam Anh Phạm
[spoiler=Ý Tưởng] - Bài toán yêu cầu tính tiền một lần gọi món có áp dụng giảm giá theo các ngưỡng: 1. Kiểm tra tính hợp lệ của dữ liệu đầu vào: — Nếu mã món code không thuộc đoạn $$$[1, 5]$$$ hoặc số lượng quantity <= 0: in ra Invalid. 2. Xác định đơn giá theo code: — Mã 1: 50.000 đồng. — Mã 2: 80.000 đồng. — Mã 3: 60.000 đồng. — Mã 4: 70.000 đồng. — Mã 5: 40.000 đồng. 3. Tính tổng tiền ban đầu: $$$\text{tổng} = \text{đơn giá} \times \text{quantity}$$$. 4. Áp dụng mức giảm giá: — Nếu $$$\text{tổng} \ge 300.000$$$: giảm 10%, số tiền còn lại là $$$\text{tổng} \times 0.9$$$ (hoặc $$$\text{tổng} \times 90 / 100$$$). — Nếu $$$150.000 \le \text{tổng} \lt 300.000$$$: giảm 5%, số tiền còn lại là $$$\text{tổng} \times 0.95$$$ (hoặc $$$\text{tổng} \times 95 / 100$$$). — Nếu $$$\text{tổng} \lt 150.000$$$: giữ nguyên. - Lưu ý: Các đơn giá đều là bội của 10.000 nên khi giảm 5% hay 10% kết quả luôn là số nguyên. Ta có thể dùng phép tính số nguyên long long để tránh sai số dấu phẩy động. - Độ phức tạp thời gian: $$$O(1)$$$. - Độ phức tạp không gian: $$$O(1)$$$. [/spoiler]
[spoiler=Code] ```cpp
include
using namespace std;
int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);
long long code, quantity;
if (cin >> code >> quantity) {
if (code < 1 || code > 5 || quantity <= 0) {
cout << "Invalid\n";
return 0;
}
long long price = 0;
if (code == 1) price = 50000;
else if (code == 2) price = 80000;
else if (code == 3) price = 60000;
else if (code == 4) price = 70000;
else if (code == 5) price = 40000;
long long total = price * quantity;
if (total >= 300000) {
total = total * 90 / 100;
} else if (total >= 150000) {
total = total * 95 / 100;
}
cout << total << "\n";
}
return 0;} ```
H. [GCC TRAINING 2026 — PRACTICE 1] Đấu Kiếm
[spoiler=Ý Tưởng] - Bài toán yêu cầu xác định xem hai đường thẳng (chú ý là đường thẳng vô hạn kéo dài theo hai thanh kiếm, không phải đoạn thẳng) có cắt nhau hay không. - Hai đường thẳng trên mặt phẳng tọa độ $$$2D$$$ sẽ: — Cắt nhau khi và chỉ khi chúng không song song với nhau (đề bài đã đảm bảo hai đường không trùng nhau). — Song song với nhau khi và chỉ khi hai vector chỉ phương của chúng cùng phương. - Vector chỉ phương của đường thẳng Nam Anh là:
- Vector chỉ phương của đường thẳng Đồng Hà là:
- Hai vector $$$\vec{u_1}$$$ và $$$\vec{u_2}$$$ cùng phương (tức hai đường thẳng song song) khi và chỉ khi tích chéo bằng 0:
- Do đó: — Nếu tích chéo bằng $$$0$$$: hai đường thẳng song song (không cắt nhau) $$$\to$$$ In ra
DONG HA. — Nếu tích chéo khác $$$0$$$: hai đường thẳng cắt nhau $$$\to$$$ In raNAM ANH. - Lưu ý kiểu dữ liệu: Tọa độ lên tới $$$10^6$$$ nên $$$dx, dy$$$ có thể đạt $$$2 \times 10^6$$$, tích chéo có thể đạt khoảng $$$4 \times 10^{12}$$$, vì vậy cần dùng kiểu
long longđể tránh tràn số. - Độ phức tạp thời gian: $$$O(1)$$$.
- Độ phức tạp không gian: $$$O(1)$$$. [/spoiler]
[spoiler=Code] ```cpp
include
using namespace std;
int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);
long long x1, y1, x2, y2;
long long x3, y3, x4, y4;
if (cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4) {
long long dx1 = x2 - x1;
long long dy1 = y2 - y1;
long long dx2 = x4 - x3;
long long dy2 = y4 - y3;
long long cross_product = dx1 * dy2 - dy1 * dx2;
if (cross_product == 0) {
cout << "DONG HA\n";
} else {
cout << "NAM ANH\n";
}
}
return 0;} ```
J. [GCC TRAINING 2026 — PRACTICE 1] Đấu Kiếm 2
[spoiler=Ý Tưởng] - Bài toán yêu cầu tính thời gian thực tế $$$t$$$ để viên đạn bay tới đầu Nam Anh sau khi chịu ảnh hưởng của thời tiết, sau đó so sánh với thời gian tối đa $$$s$$$: — Ban đầu, vận tốc là $$$v$$$ và khoảng cách là $$$d$$$. — Ảnh hưởng của thời tiết $$$w$$$: — Nếu $$$w = \text{'S'}$$$ (Nắng): Giữ nguyên $$$v$$$ và $$$d$$$. — Nếu $$$w = \text{'W'}$$$ (Gió): Vận tốc giảm $$$36\% \implies v_{\text{thực}} = v \times (1 - 0.36) = v \times 0.64$$$. Khoảng cách $$$d$$$ giữ nguyên. — Nếu $$$w = \text{'F'}$$$ (Sương mù): Khoảng cách giảm $$$18\% \implies d_{\text{thực}} = d \times (1 - 0.18) = d \times 0.82$$$. Vận tốc $$$v$$$ giữ nguyên. - Thời gian đạn bay thực tế là:
- Để hạ gục được Nam Anh, viên đạn phải đến đích trong vòng $$$s$$$ giây, tức là $$$t \le s$$$. — Thay vì chia số thực dễ gây sai số nhỏ, ta có thể so sánh: $$$d_{\text{thực}} \le s \times v_{\text{thực}}$$$ (hoặc dùng sai số $$$\epsilon = 10^{-9}$$$ khi so sánh số thực). — Nếu $$$t \le s$$$: Đồng Hà hạ gục thành công $$$\implies$$$ In ra
NAM ANH DA BI HA GUc. — Nếu $$$t \gt s$$$: Không hạ gục được $$$\implies$$$ In raNAM ANH CHUA BI Ha GUC. - Lưu ý đặc biệt: Đề bài viết hoa/thường ở xâu kết quả rất đặc trưng (
GUcvàHa GUC), cần in chính xác tuyệt đối từng ký tự. - Độ phức tạp thời gian: $$$O(1)$$$.
- Độ phức tạp không gian: $$$O(1)$$$. [/spoiler]
[spoiler=Code] ```cpp
include
using namespace std;
int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);
double v, d, s;
char w;
if (cin >> v >> d >> s >> w) {
if (w == 'W') {
v *= 0.64;
} else if (w == 'F') {
d *= 0.82;
}
double time_needed = d / v;
if (time_needed <= s + 1e-9) {
cout << "NAM ANH DA BI HA GUc\n";
} else {
cout << "NAM ANH CHUA BI Ha GUC\n";
}
}
return 0;} ```
K. [GCC TRAINING 2026 — PRACTICE 1] Nam Anh và 2 chỗ đỗ bí ẩn
[spoiler=Ý Tưởng] - Bài toán yêu cầu giải phương trình bậc hai $$$ax^2 + bx + c = 0$$$ với điều kiện đề bài cho trước $$$a \ne 0$$$ và phương trình luôn có nghiệm thực. - Tính biệt thức $$$\Delta$$$ (delta):
- Vì đề bài bảo đảm luôn có nghiệm thực nên $$$\Delta \ge 0$$$. Ta xét: — Nếu $$$\Delta == 0$$$: Phương trình có nghiệm kép:
— Nếu $$$\Delta \gt 0$$$: Phương trình có $$$2$$$ nghiệm phân biệt:
- Sắp xếp thứ tự tăng dần: — Lưu ý mẫu số $$$2a$$$ có thể âm nếu $$$a \lt 0$$$, dẫn đến công thức trên không tự động đảm bảo $$$x_1 \le x_2$$$. — Cách an toàn và gọn nhất là tính ra hai giá trị $$$x_1, x_2$$$, sau đó nếu $$$x_1 \gt x_2$$$ thì thực hiện đổi chỗ (
swap(x1, x2)). - Định dạng đầu ra: Dùng
fixedvàsetprecision(6)từ thư viện<iomanip>để in đúng $$$6$$$ chữ số phần thập phân. - Độ phức tạp thời gian: $$$O(1)$$$.
- Độ phức tạp không gian: $$$O(1)$$$. [/spoiler]
[spoiler=Code] ```cpp
include
include
include
include
using namespace std;
int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);
double a, b, c;
if (cin >> a >> b >> c) {
double delta = b * b - 4 * a * c;
if (delta < 0) delta = 0; // Tránh sai số nhỏ khiến delta âm
double x1 = (-b - sqrt(delta)) / (2 * a);
double x2 = (-b + sqrt(delta)) / (2 * a);
if (x1 > x2) {
swap(x1, x2);
}
cout << fixed << setprecision(6) << x1 << " " << x2 << "\n";
}
return 0;} ```
L. [GCC TRAINING 2026 — PRACTICE 1] Tọa Độ Trạm Radar Vũ Trụ
[spoiler=Ý Tưởng] - Bài toán yêu cầu tính toán chỉ số năng lượng $$$P$$$ theo chế độ quét type và xác định trạng thái cảnh báo của trạm chỉ huy: 1. Kiểm tra type hợp lệ: — Nếu type $$$\notin {1, 2, 3, 4}$$$: In ra INVALID TYPE và kết thúc chương trình. 2. Tính giá trị $$$P$$$ theo type: — type == 1: $$$P = \sqrt{x_0^2 + y_0^2}$$$ (Khoảng cách Euclid). — type == 2: $$$P = \vert{}x_0\vert{} + \vert{}y_0\vert{}$$$ (Khoảng cách Manhattan). — type == 3: $$$P = \frac{x_0^2 + y_0^2}{\vert{}x_0 - y_0\vert{} + 1}$$$. — type == 4: $$$P = \sqrt[3]{\vert{}x_0^3 - y_0^3\vert{}}$$$. Trong C++, ta dùng hàm căn bậc ba cbrt(abs(x0*x0*x0 - y0*y0*y0)) hoặc tính lũy thừa qua double. 3. Lưu ý về kiểu dữ liệu và tràn số: — Tọa độ $$$-10^6 \le x_0, y_0 \le 10^6$$$, nên $$$x_0^2, y_0^2$$$ có thể đạt $$$10^{12}$$$, và $$$x_0^3, y_0^3$$$ có thể đạt tới $$$10^{18}$$$. Cần dùng kiểu double hoặc ép sang số thực/long long trước khi tính toán để tránh tràn số nguyên. 4. Xác định trạng thái cảnh báo theo thứ tự ưu tiên: — Nếu $$$x_0 = 0$$$ và $$$y_0 = 0$$$: In ra BASE DEFENSE. — Ngược lại: — Nếu $$$P \lt 100$$$: In ra SAFE. — Nếu $$$100 \le P \le 10^6$$$: In ra WARNING. — Nếu $$$P \gt 10^6$$$: In ra DANGER. 5. Định dạng đầu ra: — Dòng 1: In giá trị $$$P$$$ làm tròn chính xác 2 chữ số thập phân (fixed, setprecision(2)). — Dòng 2: In chuỗi trạng thái cảnh báo tương ứng. - Độ phức tạp thời gian: $$$O(1)$$$. - Độ phức tạp không gian: $$$O(1)$$$. [/spoiler]
[spoiler=Code] ```cpp
include
include
include
using namespace std;
int main() { ios_base::sync_with_stdio(false); cin.tie(NULL);
long long x0, y0, type;
if (cin >> x0 >> y0 >> type) {
if (type < 1 || type > 4) {
cout << "INVALID TYPE\n";
return 0;
}
double p = 0.0;
double x = (double)x0;
double y = (double)y0;
if (type == 1) {
p = sqrt(x * x + y * y);
} else if (type == 2) {
p = abs(x) + abs(y);
} else if (type == 3) {
p = (x * x + y * y) / (abs(x - y) + 1.0);
} else if (type == 4) {
p = cbrt(abs(x * x * x - y * y * y));
}
cout << fixed << setprecision(2) << p << "\n";
if (x0 == 0 && y0 == 0) {
cout << "BASE DEFENSE\n";
} else if (p < 100.0) {
cout << "SAFE\n";
} else if (p <= 1000000.0) {
cout << "WARNING\n";
} else {
cout << "DANGER\n";
}
}
return 0;} ```




