Danh mục: Học Lập Trình C++ từ cơ bản đến nâng cao

6 BÀI TẬP C++ CHUẨN THI HỌC SINH GIỎI MỚI NHẤT 2026

6 BÀI TẬP C++ CHUẨN THI HỌC SINH GIỎI MỚI NHẤT 2026

Tài liệu này tổng hợp các bài toán lập trình C++ từ căn bản đến nâng cao được thiết kế hoàn toàn theo format các kỳ thi Học sinh giỏi (HSG) các cấp. Mỗi bài toán đều quy định rõ ràng tệp dữ liệu vào, tệp kết quả ra, giới hạn dữ liệu (subtasks) và kèm theo mã nguồn giải mẫu tối ưu, sử dụng định danh biến bằng tiếng Việt trực quan, giúp học sinh nắm vững bản chất thuật toán.

Bài 1: Tính toán kích thước hình học (HCN)

Bài toán: Cho hai số thực dương là chiều dài và chiều rộng của một mảnh vườn hình chữ nhật. Tính chu vi và diện tích mảnh vườn. Kết quả làm tròn đến 2 chữ số thập phân.

  • Thời gian chạy: 1.0 giây

  • Dữ liệu vào (HCN.INP): Một dòng chứa hai số thực $a$$b$ (0 < a, b ≤ 10^6).

  • Dữ liệu ra (HCN.OUT): Một dòng chứa chu vi và diện tích, cách nhau một khoảng trắng.

Ví dụ:

  • Input (HCN.INP): 5.5 3.2

  • Output (HCN.OUT): 17.40 17.60

Code C++ tham khảo:

C++

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    freopen("HCN.INP", "r", stdin);
    freopen("HCN.OUT", "w", stdout);

    double dai, rong;
    if (cin >> dai >> rong) {
        double chu_vi = (dai + rong) * 2;
        double dien_tich = dai * rong;
        cout << fixed << setprecision(2) << chu_vi << " " << dien_tich << endl;
    }
    return 0;
}

Bài 2: Khảo sát số nguyên tố lớn (SNT)

Bài toán: Kiểm tra số nguyên dương $N$ có phải là số nguyên tố hay không.

  • Thời gian chạy: 1.0 giây

  • Dữ liệu vào (SNT.INP): Số nguyên dương $N$.

    • Subtask 1 (60%): N ≤ 10^6

    • Subtask 2 (40%): N ≤ 10^12

  • Dữ liệu ra (SNT.OUT): In ra YES nếu là số nguyên tố, ngược lại in NO.

Ví dụ:

  • Input (SNT.INP): 97

  • Output (SNT.OUT): YES

Code C++ tham khảo:

C++

#include <iostream>
#include <cmath>
using namespace std;

int main() {
    freopen("SNT.INP", "r", stdin);
    freopen("SNT.OUT", "w", stdout);

    long long n; 
    cin >> n;

    if (n < 2) {
        cout << "NO\n";
        return 0;
    }

    bool la_snt = true;
    long long can_bac_hai = sqrt(n);
    
    for (long long i = 2; i <= can_bac_hai; i++) {
        if (n % i == 0) {
            la_snt = false;
            break;
        }
    }

    if (la_snt) cout << "YES\n";
    else cout << "NO\n";
    
    return 0;
}

Bài 3: Thống kê ký tự nguyên âm (CHUOI)

Bài toán: Đếm số lượng nguyên âm (‘a’, ‘e’, ‘i’, ‘o’, ‘u’) trong một chuỗi ký tự.

  • Thời gian chạy: 1.0 giây

  • Dữ liệu vào (CHUOI.INP): Chuỗi ký tự $S$ (chiều dài ≤ 1000).

  • Dữ liệu ra (CHUOI.OUT): Số lượng nguyên âm đếm được.

Ví dụ:

  • Input (CHUOI.INP): Lap trinh C++ Chuan HSG

  • Output (CHUOI.OUT): 5

Code C++ tham khảo:

C++

#include <iostream>
#include <string>
using namespace std;

int main() {
    freopen("CHUOI.INP", "r", stdin);
    freopen("CHUOI.OUT", "w", stdout);

    string van_ban;
    getline(cin, van_ban); 

    int bien_dem = 0;
    for (int i = 0; i < van_ban.length(); i++) {
        char ky_tu = tolower(van_ban[i]);
        if (ky_tu == 'a' || ky_tu == 'e' || ky_tu == 'i' || ky_tu == 'o' || ky_tu == 'u') {
            bien_dem++;
        }
    }

    cout << bien_dem << endl;
    return 0;
}

Bài 4: Sắp xếp và tối ưu mảng số (SAPXEP)

Bài toán: Sắp xếp mảng $N$ số nguyên theo thứ tự tăng dần.

  • Thời gian chạy: 1.0 giây

  • Dữ liệu vào (SAPXEP.INP): * Dòng 1: Số nguyên $N$ (N ≤ 10^5).

    • Dòng 2: $N$ số nguyên cách nhau một dấu cách.

  • Dữ liệu ra (SAPXEP.OUT): Mảng đã sắp xếp tăng dần.

Ví dụ:

  • Input (SAPXEP.INP):

    5

    12 -3 7 0 5

  • Output (SAPXEP.OUT): -3 0 5 7 12

Code C++ tham khảo:

C++

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    freopen("SAPXEP.INP", "r", stdin);
    freopen("SAPXEP.OUT", "w", stdout);

    int so_luong;
    if (cin >> so_luong) {
        vector<int> danh_sach(so_luong);
        
        for (int i = 0; i < so_luong; i++) {
            cin >> danh_sach[i];
        }

        sort(danh_sach.begin(), danh_sach.end());

        for (int i = 0; i < so_luong; i++) {
            cout << danh_sach[i] << " ";
        }
        cout << endl;
    }
    return 0;
}

Bài 5: Tối giản phân số bằng OOP (PHANSO)

Bài toán: Dùng lập trình hướng đối tượng xây dựng lớp Phân số để cộng 2 phân số và in ra kết quả tối giản.

  • Thời gian chạy: 1.0 giây

  • Dữ liệu vào (PHANSO.INP): 4 số nguyên: Tử 1, Mẫu 1, Tử 2, Mẫu 2 (trong khoảng -10^4 đến 10^4).

  • Dữ liệu ra (PHANSO.OUT): Phân số tổng tối giản (nếu mẫu là 1 chỉ in tử số).

Ví dụ:

  • Input (PHANSO.INP): 1 6 2 3

  • Output (PHANSO.OUT): 5/6

Code C++ tham khảo:

C++

#include <iostream>
#include <cmath>
using namespace std;

class PhanSo {
private:
    long long tu, mau;

    long long tim_ucln(long long a, long long b) {
        a = abs(a); b = abs(b);
        while (b != 0) {
            long long tam = b;
            b = a % b;
            a = tam;
        }
        return a;
    }

public:
    PhanSo(long long t = 0, long long m = 1) {
        tu = t;
        mau = (m == 0) ? 1 : m;
    }

    void toi_gian() {
        long long ucln = tim_ucln(tu, mau);
        tu /= ucln;
        mau /= ucln;
        if (mau < 0) { 
            tu = -tu;
            mau = -mau;
        }
    }

    PhanSo cong(PhanSo doi_tac) {
        PhanSo ket_qua;
        ket_qua.tu = this->tu * doi_tac.mau + doi_tac.tu * this->mau;
        ket_qua.mau = this->mau * doi_tac.mau;
        ket_qua.toi_gian();
        return ket_qua;
    }

    void in_ket_qua() {
        if (mau == 1) cout << tu << endl;
        else cout << tu << "/" << mau << endl;
    }
};

int main() {
    freopen("PHANSO.INP", "r", stdin);
    freopen("PHANSO.OUT", "w", stdout);

    long long t1, m1, t2, m2;
    if (cin >> t1 >> m1 >> t2 >> m2) {
        PhanSo ps1(t1, m1), ps2(t2, m2);
        PhanSo tong = ps1.cong(ps2);
        tong.in_ket_qua();
    }
    return 0;
}

Bài 6: Tìm số xuất hiện nhiều nhất (TIMSO)

Bài toán: Tìm số xuất hiện nhiều nhất trong dãy. Nếu có nhiều số cùng số lần xuất hiện, chọn số nhỏ nhất.

  • Thời gian chạy: 1.0 giây

  • Dữ liệu vào (TIMSO.INP): * Dòng 1: $N$ (N ≤ 10^5).

    • Dòng 2: $N$ số nguyên.

  • Dữ liệu ra (TIMSO.OUT): Giá trị số tìm được và số lần xuất hiện.

Ví dụ:

  • Input (TIMSO.INP):

    7

    2 3 5 2 3 8 2

  • Output (TIMSO.OUT): 2 3

Code C++ tham khảo:

C++

#include <iostream>
#include <map>
using namespace std;

int main() {
    freopen("TIMSO.INP", "r", stdin);
    freopen("TIMSO.OUT", "w", stdout);

    int n;
    if (cin >> n) {
        map<int, int> bo_dem;
        int so_nhap;
        
        for (int i = 0; i < n; i++) {
            cin >> so_nhap;
            bo_dem[so_nhap]++; 
        }

        int max_tan_suat = 0;
        int gia_tri_toi_uu = 0;

        for (auto phan_tu : bo_dem) {
            if (phan_tu.second > max_tan_suat) {
                max_tan_suat = phan_tu.second;
                gia_tri_toi_uu = phan_tu.first;
            }
        }

        cout << gia_tri_toi_uu << " " << max_tan_suat << endl;
    }
    return 0;
}

Tags: #HocLapTrinhC #LapTrinhC++ #ThiHSGTinHoc #CodeC++CoBan #GiaiThuatC++ #DeThiTinHoc #TuHocC++

10 CHƯƠNG HƯỚNG DẪN HỌC LẬP TRÌNH C++ TỪ CƠ BẢN ĐẾN NÂNG CAO

1. Giới thiệu về C++

C++ là ngôn ngữ lập trình được phát triển bởi Bjarne Stroustrup vào năm 1985 dựa trên ngôn ngữ C. Đây là một trong những ngôn ngữ mạnh mẽ và phổ biến nhất hiện nay, được sử dụng để phát triển:

  • Phần mềm máy tính
  • Game
  • Hệ điều hành
  • Trí tuệ nhân tạo (AI)
  • Ứng dụng tài chính
  • Phần mềm nhúng

Ưu điểm của C++

  • Tốc độ xử lý nhanh.
  • Hỗ trợ lập trình hướng đối tượng (OOP).
  • Có thư viện phong phú.
  • Được sử dụng rộng rãi trong công nghiệp.

CHƯƠNG 1: LÀM QUEN VỚI C++

1. Cấu trúc chương trình C++

Ví dụ:

#include <iostream>
using namespace std;

int main() {
    cout << "Xin chao C++";
    return 0;
}

Giải thích

  • #include <iostream>: Thư viện nhập xuất.
  • using namespace std;: Sử dụng không gian tên chuẩn.
  • main(): Hàm chính của chương trình.
  • cout: Xuất dữ liệu ra màn hình.
  • return 0;: Kết thúc chương trình.

2. Biến và kiểu dữ liệu

Các kiểu dữ liệu cơ bản

KiểuÝ nghĩaVí dụ
intSố nguyên5
floatSố thực3.14
doubleSố thực độ chính xác cao3.141592
charKý tự‘A’
boolĐúng/Saitrue
stringChuỗi ký tự“Hello”

Ví dụ

int age = 18;
float diem = 8.5;
char grade = 'A';
string name = "Tan";

Bài tập

Bài 1

Nhập tên và tuổi của một người rồi xuất ra màn hình.

Ví dụ

Input

Tan
18

Output

Ten: Tan
Tuoi: 18

CHƯƠNG 2: CÂU LỆNH ĐIỀU KIỆN

1. Câu lệnh if

if (dieu_kien)
{
    // câu lệnh
}

Ví dụ:

int a;

cin >> a;

if (a > 0)
{
    cout << "So duong";
}

2. Câu lệnh if…else

if(a % 2 == 0)
{
    cout << "So chan";
}
else
{
    cout << "So le";
}

3. Câu lệnh switch

switch(n)
{
    case 1:
        cout<<"Mot";
        break;

    case 2:
        cout<<"Hai";
        break;

    default:
        cout<<"Khong hop le";
}

Bài tập

Bài 2

Nhập số nguyên n.

  • Nếu n > 0 in “So duong”
  • Nếu n < 0 in “So am”
  • Nếu n = 0 in “So 0”

CHƯƠNG 3: VÒNG LẶP

1. Vòng lặp for

for(int i=1;i<=10;i++)
{
    cout<<i<<" ";
}

Kết quả:

1 2 3 4 5 6 7 8 9 10

2. Vòng lặp while

int i=1;

while(i<=5)
{
    cout<<i<<" ";
    i++;
}

Bài tập

Bài 3

Tính tổng:

S = 1 + 2 + 3 + ... + n

Ví dụ:

Input

5

Output

15

CHƯƠNG 4: HÀM (FUNCTION)

Hàm giúp chia chương trình thành các phần nhỏ.

Ví dụ:

int tong(int a, int b)
{
    return a+b;
}

int main()
{
    cout<<tong(3,5);

    return 0;
}

Kết quả:

8

Bài tập

Viết hàm:

  1. Tính giai thừa n!
  2. Kiểm tra số nguyên tố.
  3. Tính UCLN của hai số.

CHƯƠNG 5: MẢNG (ARRAY)

Khai báo

int a[100];

Nhập mảng

int n;

cin>>n;

for(int i=0;i<n;i++)
{
    cin>>a[i];
}

Xuất mảng

for(int i=0;i<n;i++)
{
    cout<<a[i]<<" ";
}

Bài tập

Cho mảng n số nguyên.

Hãy:

  • Tính tổng các phần tử.
  • Tìm số lớn nhất.
  • Tìm số nhỏ nhất.
  • Sắp xếp tăng dần.

CHƯƠNG 6: CHUỖI (STRING)

Ví dụ:

string s;

getline(cin,s);

cout<<s;

Một số hàm thường dùng

s.length();      // độ dài
s.substr(0,3);   // cắt chuỗi
s.find("abc");   // tìm chuỗi

Bài tập

Nhập một chuỗi.

  1. Đếm số ký tự.
  2. Đếm số chữ cái.
  3. Đếm số từ.
  4. Đảo ngược chuỗi.

CHƯƠNG 7: CON TRỎ

Con trỏ là biến lưu địa chỉ của biến khác.

Ví dụ:

int a=10;

int *p=&a;

cout<<a<<endl;
cout<<&a<<endl;
cout<<p<<endl;
cout<<*p<<endl;

CHƯƠNG 8: LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (OOP)

1. Class

class Student
{
public:

    string name;
    int age;

    void display()
    {
        cout<<name<<" "<<age;
    }
};

2. Tạo đối tượng

Student s;

s.name="Tan";

s.age=18;

s.display();

Các khái niệm OOP quan trọng

Encapsulation (Đóng gói)

Ẩn dữ liệu bằng từ khóa:

private

Inheritance (Kế thừa)

class Animal
{
};

class Dog : public Animal
{
};

Polymorphism (Đa hình)

Cho phép cùng tên hàm nhưng hoạt động khác nhau.

Abstraction (Trừu tượng)

Ẩn chi tiết cài đặt và chỉ cung cấp chức năng cần thiết.


CHƯƠNG 9: THƯ VIỆN STL

STL (Standard Template Library) là thư viện cực kỳ quan trọng trong C++.

Vector

vector<int> a;

a.push_back(10);

a.push_back(20);

cout<<a.size();

Stack

stack<int> st;

st.push(1);

st.push(2);

st.pop();

Queue

queue<int> q;

q.push(5);

q.push(10);

q.pop();

Map

map<string,int> mp;

mp["Tan"]=18;

cout<<mp["Tan"];

CHƯƠNG 10: THUẬT TOÁN NÂNG CAO

Sau khi học xong C++ cơ bản, bạn nên học:

1. Đệ quy (Recursion)

Ví dụ tính giai thừa:

int gt(int n)
{
    if(n==0)
        return 1;

    return n*gt(n-1);
}

2. Sắp xếp

  • Bubble Sort
  • Selection Sort
  • Insertion Sort
  • Merge Sort
  • Quick Sort

3. Tìm kiếm

  • Linear Search
  • Binary Search

4. Quy hoạch động (Dynamic Programming)

Ví dụ:

  • Dãy Fibonacci
  • Balo 0/1
  • Đường đi ngắn nhất

BÀI TẬP TỔNG HỢP

Bài 1

Nhập n.

Tính:

S = 1² + 2² + 3² + ... + n²

Bài 2

Nhập mảng n số nguyên.

In ra:

  • Số lớn nhất
  • Số nhỏ nhất
  • Trung bình cộng
  • Mảng sau khi sắp xếp

Bài 3

Viết chương trình quản lý sinh viên gồm:

  • Mã sinh viên
  • Họ tên
  • Tuổi
  • Điểm trung bình

Chức năng:

  1. Thêm sinh viên
  2. Xóa sinh viên
  3. Sửa thông tin
  4. Tìm kiếm
  5. Sắp xếp theo điểm
  6. Lưu dữ liệu ra file

LỘ TRÌNH HỌC C++ ĐỀ XUẤT

Tuần 1

  • Biến
  • Kiểu dữ liệu
  • if, switch
  • for, while

Tuần 2

  • Hàm
  • Mảng
  • Chuỗi
  • Con trỏ

Tuần 3

  • Struct
  • Class
  • OOP

Tuần 4

  • Vector
  • Stack
  • Queue
  • Map
  • Thuật toán cơ bản

Tuần 5 trở đi

  • Đệ quy
  • Thuật toán nâng cao
  • Quy hoạch động
  • Giải bài tập trên các trang OJ như Codeforces, LeetCode, VNOI.

Kết luận

C++ là ngôn ngữ mạnh mẽ, phù hợp cho cả người mới bắt đầu và lập trình viên chuyên nghiệp. Hãy học theo thứ tự:

Cơ bản → Hàm → Mảng → Chuỗi → Con trỏ → OOP → STL → Thuật toán → Dự án thực tế

Kiên trì luyện tập mỗi ngày sẽ giúp bạn thành thạo C++ và có nền tảng tốt để học các lĩnh vực như AI, lập trình game, phát triển phần mềm và thi lập trình cạnh tranh.