Năm: 2026

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.

Khóa Học Tin Học Online Thầy Dân: Luyện Thi Chuyên Tin & Tin Văn Phòng Cấp Tốc

Khóa Học Tin Học Online Thầy Dân: Luyện Thi Chuyên Tin & Tin Văn Phòng Cấp Tốc

Bạn đang tìm kiếm một lộ trình học Tin học bài bản để thi vào các trường chuyên? Bạn muốn nâng cao kỹ năng Tin học văn phòng để tự tin đi làm nhưng lại không có nhiều thời gian? Khóa học Tin học Online của Thầy Dân chính là giải pháp hoàn hảo dành cho bạn.

Với phương pháp giảng dạy tận tâm, dễ hiểu và lộ trình cá nhân hóa, Thầy Dân giúp học viên làm chủ kiến thức từ cơ bản đến nâng cao ngay tại nhà.

Khóa học tin học văn phòng online miễn phí

Khóa học tin học văn phòng online miễn phí

1. Tại sao nên đăng ký khóa học Tin học Online của Thầy Dân?

Trong thời đại công nghệ số, việc học online mang lại những ưu thế vượt trội. Khi đăng ký học cùng Thầy Dân, học viên sẽ nhận được 5 lợi ích vàng:

  • Tiết kiệm thời gian và học phí: Không cần di chuyển xa, giảm thiểu chi phí đi lại nhưng vẫn đảm bảo chất lượng kiến thức như học trực tiếp.

  • Tặng kèm tài liệu độc quyền: Bộ giáo trình và bài tập được Thầy Dân biên soạn riêng, sát với thực tế và các kỳ thi.

  • Luyện thi vào lớp 10 chuyên Tin tại nhà: Lộ trình ôn luyện bài bản, tập trung vào các dạng đề thi của các trường chuyên trọng điểm.

  • Ôn thi học sinh giỏi cấp Huyện, Tỉnh: Hỗ trợ học viên bồi dưỡng kiến thức nâng cao, tư duy lập trình để chinh phục các giải thưởng lớn.

  • Học Tin học văn phòng thực chiến: Trang bị kỹ năng Word, Excel, PowerPoint chuyên sâu để ứng dụng ngay vào công việc văn phòng.

Tin học lớp 5

Tin học lớp 5


2. Các chương trình đào tạo trọng điểm

Luyện thi lớp 10 Chuyên Tin & Học sinh giỏi

Đây là thế mạnh của Thầy Dân. Chương trình được thiết kế giúp học viên nắm vững thuật toán, tư duy logic và cách xử lý các dạng bài khó trong đề thi học sinh giỏi và kỳ thi tuyển sinh lớp 10 trường chuyên.

73 Đề thi HSG Tin học Python THCS cấp tỉnh Tiền Giang có ĐÁP ÁN (Mới & Chọn Lọc)

73 Đề thi HSG Tin học Python THCS cấp tỉnh Tiền Giang có ĐÁP ÁN (Mới & Chọn Lọc)

Tin học văn phòng cho người đi làm

Khóa học tập trung vào các kỹ năng thực tế mà doanh nghiệp cần. Giúp bạn xử lý văn bản chuyên nghiệp, quản lý dữ liệu hiệu quả bằng Excel và tạo ra những bản thuyết trình ấn tượng.

Khoá luyện thi Chuyên Tin Tiền Giang

Khoá luyện thi Chuyên Tin Tiền Giang


3. Hình thức học và Cam kết chất lượng

  • Khóa học tin học online thầy Dân chuyên luyện thi tin học văn phòng cấp tốc (MOS, IC3) và luyện thi chuyên tin, tập trung vào kỹ năng thực chiến, giải đề và thao tác máy tính nhanh.
  • Chương trình cá nhân hóa, dạy 1:1, phù hợp cho người đi làm, học sinh, sinh viên cần chứng chỉ gấp hoặc nâng cao kỹ năng tin học từ cơ bản đến nâng cao.

Đặc điểm khóa học:

    • Tin học văn phòng: Đào tạo cấp tốc Word, Excel, PowerPoint, kỹ năng xử lý dữ liệu và soạn thảo văn bản chuyên nghiệp.
    • Luyện thi: Ôn luyện các chứng chỉ quốc tế MOS, IC3, đáp ứng đầu ra chuẩn quốc tế.
    • Hình thức: Học online 1:1 hoặc nhóm nhỏ, linh hoạt thời gian, tương tác trực tiếp với giảng viên.
    • Cam kết: Tập trung vào thực hành, “cầm tay chỉ việc”, đảm bảo vững kiến thức và kỹ năng sau khóa học.
  • Nhận học viên thường xuyên: Bạn có thể đăng ký và bắt đầu học ngay mà không phải chờ đợi mở lớp.

  • Tương tác trực tiếp: Dù là học online, học viên vẫn được thầy hỗ trợ giải đáp thắc mắc nhanh chóng qua Zalo và các nền tảng hỗ trợ.

  • Hình ảnh thực tế: Các lớp học của Thầy Dân luôn nhận được sự tin tưởng của đông đảo phụ huynh và học sinh (như hình ảnh các lớp học trực tiếp đầy ắp học viên là minh chứng cho uy tín của thầy).

Tự học tin học văn phòng tài nhà

Tự học tin học văn phòng tài nhà


4. Liên hệ đăng ký khóa học ngay hôm nay

Đừng để rào cản về địa lý hay thời gian ngăn cản bước tiến của bạn. Hãy liên hệ ngay với Thầy Dân để được tư vấn lộ trình học phù hợp nhất với mục tiêu của bạn.

  • Giáo viên: Thầy Dân

  • Hotline/Zalo: 0937.179.278

  • Dịch vụ: Đào tạo Tin học Online/Offline, luyện thi chuyên, luyện thi HSG, đào tạo nghề văn phòng.

Học Tin học không khó – Nếu bạn có lộ trình đúng và người thầy tận tâm!

Tự học Excel dành cho người mới bắt đầu

Tự học Excel dành cho người mới bắt đầu

❓ CÂU HỎI THƯỜNG GẶP (FAQ) – TIN HỌC THẦY DÂN

1. Khóa học của Thầy Dân dành cho đối tượng nào?

Khóa học được thiết kế đa dạng cho nhiều đối tượng:

  • Học sinh cấp 2, cấp 3: Ôn thi Học sinh giỏi (HSG) cấp Huyện/Tỉnh và luyện thi vào lớp 10 chuyên Tin.

  • Người đi làm/Sinh viên: Cần học Tin học văn phòng (Word, Excel, PowerPoint) cấp tốc để phục vụ công việc.

  • Người mới bắt đầu: Muốn làm quen với máy tính bài bản từ đầu.

2. Học Online có đảm bảo chất lượng bằng học trực tiếp không?

Hoàn toàn đảm bảo! Chương trình Online của Thầy Dân được tối ưu hóa:

  • Học viên được tương tác trực tiếp, giải đáp thắc mắc qua Zalo/Ultraview.

  • Lộ trình học cá nhân hóa theo năng lực từng người.

  • Hệ thống bài tập thực hành sát với đề thi và thực tế công sở.

3. Tôi có được tặng tài liệu khi đăng ký không?

Có. Tất cả học viên khi đăng ký đều được tặng kèm bộ Tài liệu độc quyền do chính Thầy Dân biên soạn. Bộ tài liệu bao gồm lý thuyết trọng tâm, các dạng bài tập thực hành và ngân hàng đề thi các năm.

4. Lịch học và thời gian khai giảng như thế nào?

Thầy Dân nhận học viên thường xuyên. Bạn không cần phải chờ đợi đủ lớp mới bắt đầu. Thời gian học linh hoạt, phù hợp cho cả học sinh đang đi học chính khóa và người đi làm bận rộn.

5. Khóa luyện thi Chuyên Tin lớp 10 tập trung vào những gì?

Khóa học sẽ tập trung vào:

  • Rèn luyện tư duy lập trình (Pascal, C++, Python… tùy theo đề thi địa phương).

  • Xử lý các thuật toán nâng cao thường xuất hiện trong đề thi chuyên.

  • Kỹ năng giải đề và tối ưu thời gian làm bài để đạt điểm tối đa.

6. Tôi muốn học để đi làm văn phòng thì mất bao lâu?

Tùy vào kỹ năng hiện tại, thông thường chỉ sau 4 – 8 tuần, bạn sẽ làm chủ được các kỹ năng văn phòng cần thiết. Thầy tập trung dạy “thực chiến”, học đến đâu dùng được ngay đến đó, không dạy lý thuyết suông.

Đặc điểm nổi bật của các khóa học Online:
  • Luyện Thi Chuyên Tin: Tập trung kiến thức chuyên tin từ A-Z (ngôn ngữ lập trình, thuật toán, tư duy tin học).
  • Tin Học Văn Phòng Cấp Tốc: Đào tạo kỹ năng Word, Excel, PowerPoint nhanh chóng, áp dụng.
  • Hình thức: Học online tiện lợi, phù hợp cho người đi làm hoặc học sinh cần ôn thi.
  • Nội dung: Được thiết kế từ cơ bản đến nâng cao, đảm bảo học viên thành thạo kỹ

7. Cách thức đăng ký và đóng học phí như thế nào?

Bạn có thể liên hệ trực tiếp với Thầy qua các kênh sau để được tư vấn và nhận báo giá ưu đãi:

  • Số điện thoại / Zalo: 0937.179.278

  • Hình thức đóng phí: Chuyển khoản ngân hàng hoặc nộp trực tiếp tại cơ sở (nếu học offline).

Đạt giải 3 học sinh giỏi tin học cấp tỉnh

Đạt giải 3 học sinh giỏi tin học cấp tỉnh

Nếu bạn thấy hay ! xin bạn 1 phút ! vui lòng đánh giá 5 sao cho trang website của chúng tôi ! để có động lực làm thêm nhiều bài hay nữa ! cảm ơn quý khách nhé !

Vui lòng Chấm điểm 5 sao trang cho bài viết hay !

 

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

6 Giải đề thi học sinh giỏi tin học lớp 9 THCS tỉnh bình phước 2019 – 2020

🚀 Giải Chi Tiết Đề Thi HSG Tin Học THCS Bình Phước (Có Code Python Chuẩn) – Dễ Hiểu, Lên Tay Nhanh

Bạn đang ôn thi học sinh giỏi Tin học cấp tỉnh? Bài viết này tổng hợp và giải chi tiết các bài trong đề HSG Tin học THCS Bình Phước, kèm code Python chuẩn thi, giải thích dễ hiểu và tối ưu để bạn áp dụng ngay.

Hướng dẫn Giải đề thi học sinh giỏi tin học lớp 9 THCS Tỉnh Bình Phước 2019 – 2020 mới cập nhật ngày 11/4/2026

GIẢI BÀI 1: ĐIỂM TRUNG BÌNH

1 Giải đề thi học sinh giỏi tin học lớp 9 THCS tỉnh bình phước 2019 - 2020

 

import sys

sys.stdin = open("DIEMTB.INP", "r")
sys.stdout = open("DIEMTB.OUT", "w")

# đọc dữ liệu
x, y = map(int, input().split())

# tính điểm trung bình
dtb = (3 * x + y) / 4

# kiểm tra
if dtb >= 5:
    print(1)
else:
    print(0)

GIẢI BÀI 2: TÍNH TỔNG

2 De thi HSG tỉnh Bình Phước

2 thi học sinh giỏi tin học lớp 9 THCS tỉnh bình phước 2019 - 2020

🧠 Phân tích

Yêu cầu:
👉 Tính tổng M chữ số tận cùng của số N

Ví dụ:

  • N = 25487, M = 2 → lấy 2 chữ số cuối: 8 + 7 = 15
  • N = 5876512, M = 3 → lấy: 5 + 1 + 2 = 8

⚡ Cách làm

Có 2 cách:

✅ Cách 1: Dùng chuỗi (dễ hiểu nhất)

  • Đổi N → string
  • Lấy M ký tự cuối
  • Cộng lại

💻 Code Python (chuẩn thi)

import sys

sys.stdin = open("TINHTONG.INP", "r")
sys.stdout = open("TINHTONG.OUT", "w")

# đọc dữ liệu
n = input().strip()
m = int(input())

# lấy m chữ số cuối
last_digits = n[-m:]

# tính tổng
tong = 0
for c in last_digits:
    tong += int(c)

print(tong)

🚀 Cách 2: Dùng toán học (pro hơn, không cần string)

👉 Ý tưởng:

  • Lấy từng chữ số cuối bằng % 10
  • Lặp M lần

💻 Code:

 

import sys

sys.stdin = open("TINHTONG.INP", "r")
sys.stdout = open("TINHTONG.OUT", "w")

n = int(input())
m = int(input())

tong = 0

for _ in range(m):
    tong += n % 10
    n //= 10

print(tong)

 


🎯 So sánh

CáchƯu điểmNhược
ChuỗiDễ hiểuChậm hơn chút
Toán họcNhanh, chuẩn HSGKhó nghĩ hơn

🔥 Lưu ý quan trọng

  • Nếu M > số chữ số của N → vẫn chạy đúng (lấy hết số)
  • Độ phức tạp: O(M) → rất nhanh

GIẢI BÀI 3: BỘ BA SỐ LỚN NHẤT

 

3 giải bài bộ 3 lớn nhất đề thi học sinh giỏi tin học THCS

Bài này là dạng trượt cửa sổ (Sliding Window) – cực kỳ hay trong HSG 🔥


🧠 Phân tích

Ta cần:

  • Xét mọi bộ 3 số liên tiếp:

    ai+ai+1+ai+2a_i + a_{i+1} + a_{i+2}

  • Tìm tổng lớn nhất
  • Nếu nhiều bộ → chọn chỉ số nhỏ nhất

⚡ Ý tưởng tối ưu

👉 Không cần tính lại từ đầu mỗi lần
→ Dùng cửa sổ trượt

  • Ban đầu:
    sum = a[0] + a[1] + a[2]
  • Sau đó:

    sum = sum – a[i-1] + a[i+2]

⏱ Độ phức tạp: O(n) (rất nhanh)

 

import sys

# đọc/ghi file
sys.stdin = open("BOMAX.INP", "r")
sys.stdout = open("BOMAX.OUT", "w")

# nhập dữ liệu
n = int(input())
day = list(map(int, input().split()))

# tính tổng 3 phần tử đầu tiên
tong_hien_tai = day[0] + day[1] + day[2]
tong_lon_nhat = tong_hien_tai

vi_tri_bat_dau = 0  # vị trí bắt đầu (0-based)

# duyệt các bộ còn lại
for i in range(1, n - 2):
    # cập nhật tổng bằng cửa sổ trượt
    tong_hien_tai = tong_hien_tai - day[i - 1] + day[i + 2]
    
    # nếu tìm được tổng lớn hơn thì cập nhật
    if tong_hien_tai > tong_lon_nhat:
        tong_lon_nhat = tong_hien_tai
        vi_tri_bat_dau = i

# in kết quả (đổi sang chỉ số 1-based)
print(tong_lon_nhat)
print(vi_tri_bat_dau + 1, vi_tri_bat_dau + 3)

📌 Ví dụ

Input:

5
2 8 4 6 3

Các bộ:

  • (2,8,4) = 14
  • (8,4,6) = 18 ✅
  • (4,6,3) = 13

👉 Output:

18
2 4

🚀 Lưu ý quan trọng (hay bị sai)

  • Chỉ update khi > (không phải ≥)
    → để giữ chỉ số nhỏ nhất
  • In ra chỉ số 1-based

🔥 Nâng cấp (chuẩn HSG thật)

Bạn có thể gặp biến thể:

  • Bộ k phần tử lớn nhất (k bất kỳ)
  • Không liên tiếp → dùng DP
  • Tổng lớn nhất nhưng ≤ X → khó hơn

🧠 Giải thích ngắn gọn

  • tong_hien_tai: tổng của 3 số liên tiếp đang xét
  • tong_lon_nhat: tổng lớn nhất tìm được
  • vi_tri_bat_dau: vị trí đầu của bộ 3

👉 Mỗi lần:

bỏ số bên trái + thêm số bên phải

⚠️ Lỗi hay gặp

  • Dùng >= → sai (phải dùng > để lấy vị trí nhỏ nhất)
  • Quên đổi sang 1-based
  • Sai chỉ số i + 2

GIẢI BÀI 4: MẬT KHẨU

4 mật khẩu

🧠 Bài: MẬT KHẨU

📌 Yêu cầu (suy ra từ đề)

  • Cho xâu S (độ dài ≤ 255)
  • Tìm một số nguyên P từ các chữ số trong S
  • Nếu:
    • Không có chữ số nào
    • Hoặc chỉ toàn số 0
      👉 thì P = 0

🎯 Cách hiểu chuẩn (dạng rất hay thi)

👉 Lấy tất cả chữ số trong chuỗi S, ghép lại thành số lớn nhất có thể


⚡ Ví dụ dễ hiểu

SKết quả
“a1b2c3”321
“abc”0
“0000”0
“t9h2”92

 

 

 

import sys

sys.stdin = open("MATKHAU.INP", "r")
sys.stdout = open("MATKHAU.OUT", "w")

# nhập xâu
s = input().strip()

# lấy các chữ số
chu_so = []

for c in s:
    if c.isdigit():
        chu_so.append(c)

# nếu không có chữ số
if len(chu_so) == 0:
    print(0)
else:
    # sắp xếp giảm dần để tạo số lớn nhất
    chu_so.sort(reverse=True)
    
    # ghép lại thành số
    ket_qua = "".join(chu_so)
    
    # nếu toàn số 0
    if int(ket_qua) == 0:
        print(0)
    else:
        print(int(ket_qua))

🔥 Giải thích nhanh

  • isdigit() → kiểm tra có phải số không
  • sort(reverse=True) → tạo số lớn nhất
  • "".join() → ghép lại

⚠️ Lưu ý thi

  • Không dùng int sớm → dễ lỗi với số lớn
  • Xử lý riêng trường hợp toàn số 0

 

Nếu bạn thấy hay ! xin bạn 1 phút ! vui lòng đánh giá 5 sao cho trang website của chúng tôi ! để có động lực làm thêm nhiều bài hay nữa ! cảm ơn quý khách nhé !

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

76 Đề thi HSG Tin 9 cấp Tỉnh Có đáp án mới nhất (File Word & PDF)

Bạn đang tìm kiếm nguồn tài liệu ôn thi học sinh giỏi Tin học lớp 9 để chuẩn bị cho kỳ thi cấp huyện, cấp tỉnh sắp tới? Việc luyện đề từ các tỉnh thành khác nhau là phương pháp hiệu quả nhất để làm quen với cấu trúc đề, các dạng bài lập trình khó và cách tối ưu thuật toán.

Bài viết này tổng hợp 76 đề thi HSG Tin 9 cấp tỉnh có đáp án chi tiết, giúp các bạn học sinh tự tin chinh phục giải cao.

Các đề ôn thi để chuẩn bị thi Cấp XÃ thì các em vào đường dẫn phía dưới để tham khảo giúp thầy nhé!

  1. Giải đề 1 và đáp án thi Học sinh giỏi tin học Python C++ THCS có tài liệu ôn thi
  2. Giải đề 2 và đáp án thi Học sinh giỏi tin học Python C++ THCS có tài liệu ôn thi
  3. Giải đề 3 thi học sinh giỏi tin học lập trình Python có đáp án
  4. Giải đề 4 ôn thi học sinh giỏi Tin Học THCS lập trình Python có đáp án
  5. Giải đề 5 và đáp án thi HSG Tin Python có số Pell.
  6. Giải đề 6 và đáp án bồi dưỡng học sinh giỏi tin 10 có số Armstrong
  7. Giải đề 7 và đáp án  thi học sinh giỏi tin học 10 Python có số Collatz
  8. Giải đề 8 trong 20 đề Bồi dưỡng học sinh giỏi Tin học lớp 9 có số Kaprekar.
  9. Giải đề 9 thi HSG Tin học lớp 8 lập trình Python có số Happy
  10. Giải đề 10 thi tin học trẻ THPT có bài  In các xâu con trong xâu s.

1. Tại sao cần luyện đề thi HSG Tin học 9 các năm trước?

Kỳ thi học sinh giỏi Tin học lớp 9 thường tập trung vào kỹ năng giải quyết vấn đề thông qua lập trình (Pascal, C++, hoặc Python). Việc luyện tập với bộ 76 đề thi HSG Tin 9 sẽ giúp bạn:

  • Nắm vững cấu trúc đề: Thông thường gồm 3-4 bài với độ khó tăng dần (bài toán số học, xử lý xâu, quy hoạch động, đồ thị cơ bản).

  • Rèn luyện tư duy thuật toán: Tiếp cận với nhiều dạng bài mới lạ từ các tỉnh thành có phong trào Tin học mạnh như Nghệ An, Thanh Hóa, Hà Nội, Nam Định…

  • Kỹ năng trình bày: Xem đáp án chi tiết giúp bạn hiểu cách chấm điểm và tối ưu mã nguồn để đạt điểm tối đa.


2. Cấu trúc bộ đề thi HSG Tin 9 trong bộ sưu tập này

Bộ tài liệu 76 đề thi HSG Tin 9 cấp tỉnh có đáp án được chúng tôi sưu tầm và biên soạn lại một cách khoa học:

  • Đa dạng ngôn ngữ: Hỗ trợ lời giải bằng Pascal, C++ (phổ biến nhất) và một số đề mới có hướng dẫn bằng Python.

  • Phân loại theo chuyên đề: * Bài tập về số học (Số nguyên tố, số chính phương, số đặc biệt).

    • Xử lý xâu ký tự và tệp dữ liệu.

    • Thuật toán tìm kiếm và sắp xếp.

    • Kỹ thuật đệ quy và quy hoạch động cơ bản.

  • Có đáp án và hướng dẫn chấm: Giúp học sinh và giáo viên dễ dàng đối chiếu kết quả.


3. Danh sách một số đề thi tiêu biểu trong bộ 76 đề

Dưới đây là một số đề thi “hot” nhất trong bộ sưu tập mà bạn không nên bỏ qua:

  1. Đề thi HSG Tin 9 tỉnh Nghệ An (Bảng A, B).

  2. Đề thi HSG Tin 9 tỉnh Thanh Hóa (Đầy đủ các năm).

  3. Đề thi chọn đội tuyển HSG lớp 9 TP. Hà Nội.

  4. Đề thi giao lưu học sinh giỏi các tỉnh đồng bằng Bắc Bộ.

  5. Đề thi tuyển sinh vào lớp 10 chuyên Tin (Phần tự chọn HSG 9).


4. Link tải 76 Đề thi HSG Tin 9 cấp Tỉnh Có đáp án (Full File Word/PDF)

Để hỗ trợ các bạn ôn tập tốt nhất, chúng tôi đã đóng gói toàn bộ 76 đề thi vào một thư mục duy nhất. Bạn có thể tải về hoàn toàn miễn phí theo đường link dưới đây:

[Link Tải Xuống 76 Đề Thi HSG Tin 9 Có Đáp Án Tại Đây]

tai ngay vi tính tấn dân

(Lưu ý: Nếu link lỗi, vui lòng để lại bình luận phía dưới để admin cập nhật ngay lập tức).


5. Kinh nghiệm đạt điểm cao trong kỳ thi HSG Tin học 9

Ngoài việc luyện đề, bạn cần lưu ý:

  1. Đọc kỹ đề bài: Xác định rõ ràng Input, Output và các giới hạn (Constraints) của đề.

  2. Quản lý thời gian: Đừng quá sa đà vào bài khó, hãy hoàn thành chắc chắn các bài dễ để lấy điểm tuyệt đối trước.

  3. Kiểm tra kỹ các trường hợp biên: Test thử với dữ liệu nhỏ nhất, lớn nhất hoặc các trường hợp đặc biệt (n = 0, n = 1…).

  4. Cập nhật ngôn ngữ: Hiện nay nhiều tỉnh đã cho phép sử dụng C++11, C++17 và Python, hãy tận dụng các thư viện mạnh mẽ để rút ngắn thời gian làm bài.

Lời kết: Hy vọng bộ tài liệu 76 đề thi HSG Tin 9 cấp tỉnh có đáp án này sẽ là hành trang vững chắc giúp các bạn đạt kết quả cao trong kỳ thi sắp tới. Nếu thấy tài liệu hữu ích, hãy chia sẻ cho bạn bè cùng ôn tập nhé!

Giải đáp án bài 1: Tiền Điện

📌 Phân tích đề bài (tư duy giải)

  • n hộ gia đình, mỗi hộ dùng aᵢ KWh điện.

  • Giá điện chia 3 bậc:

BậcSố KWhGiá
11 → 1002500 đ/KWh
2101 → 2003000 đ/KWh
3≥ 2013500 đ/KWh

👉 Với mỗi hộ, ta:

  • Tính tiền bậc 1 (tối đa 100 KWh)

  • Nếu còn → tính tiếp bậc 2 (tối đa 100 KWh)

  • Nếu còn nữa → bậc 3

👉 Cộng tiền của tất cả các hộ lại.


🧠 Thuật toán

Với mỗi a (số KWh của 1 hộ):

  • Nếu a ≤ 100
    → tiền = a * 2500

  • Nếu 100 < a ≤ 200
    → tiền = 100*2500 + (a-100)*3000

  • Nếu a > 200
    → tiền = 100*2500 + 100*3000 + (a-200)*3500

Code Python (chuẩn thi)

import sys

sys.stdin = open("ELCOST.INP", "r")
sys.stdout = open("ELCOST.OUT", "w")

# Đọc số hộ gia đình
n = int(sys.stdin.readline().strip())

# Đọc danh sách số KWh của các hộ
danh_sach = list(map(int, sys.stdin.readline().split()))

tong_tien = 0

for a in danh_sach:
    if a <= 100:
        tien = a * 2500
    elif a <= 200:
        tien = 100 * 2500 + (a - 100) * 3000
    else:
        tien = 100 * 2500 + 100 * 3000 + (a - 200) * 3500

    tong_tien += tien

# In kết quả
print(tong_tien)

✍️ Giải thích code ngắn gọn

  • sys.stdin, sys.stdout → đúng chuẩn chấm bài tự động

  • Duyệt từng hộ → tính tiền đúng theo bậc

  • Cộng dồn vào tong_tien

  • In ra một số nguyên duy nhất


⏱️ Phân tích độ phức tạp

  • Vòng lặp chạy n lần

  • Mỗi lần chỉ tính toán hằng số

👉 Độ phức tạp thời gian:

O(n)

👉 Độ phức tạp bộ nhớ:

O(1) 


✅ Nhận xét theo chuẩn bài thi HSG

✔ Thuật toán đơn giản – đúng bản chất
✔ Không bị tràn số
✔ Chạy nhanh với n ≤ 10^4
✔ Dễ mở rộng nếu đề thêm bậc điện

Giải đáp án bài 2: Độ mạnh của xâu?

🔍 Phân tích đề bài

  • Cho xâu s gồm:

    • Chữ cái thường a–z

    • Chữ số 0–9

  • Không có khoảng trắng, không có ký tự đặc biệt

  • Độ dài xâu ≤ 10^3

👉 Định nghĩa “độ mạnh của xâu”

Độ mạnh=(số kí tự phân biệt×(số lần xuất hiện nhiều nhất của 1kí tự )


🧠 Tư duy giải

Ta cần 2 thông tin:

  1. Số kí tự phân biệt trong xâu

    • Chính là số lượng kí tự khác nhau

  2. Số lần xuất hiện nhiều nhất

    • Tìm kí tự xuất hiện nhiều nhất

👉 Cách làm hiệu quả:

  • Dùng dictionary (từ điển) để đếm số lần xuất hiện của từng kí tự

 

Code Python (chuẩn thi)

import sys

sys.stdin = open("STRONG.INP", "r")
sys.stdout = open("STRONG.OUT", "w")

# Đọc xâu
s = sys.stdin.readline().strip()

dem = {}

# Đếm số lần xuất hiện của từng kí tự
for ch in s:
    if ch in dem:
        dem[ch] += 1
    else:
        dem[ch] = 1

# Số kí tự phân biệt
so_ki_tu_phan_biet = len(dem)

# Số lần xuất hiện nhiều nhất
lan_xuat_hien_nhieu_nhat = max(dem.values())

# Độ mạnh của xâu
do_manh = so_ki_tu_phan_biet * lan_xuat_hien_nhieu_nhat

print(do_manh)

✍️ Giải thích code

  • dem: từ điển lưu

    khóa = kí tự
    giá trị = số lần xuất hiện

  • len(dem) → số kí tự phân biệt

  • max(dem.values()) → tần suất lớn nhất

  • Nhân 2 giá trị → độ mạnh


🧪 Kiểm tra bằng ví dụ đề bài

Ví dụ 1

STRONG.INP
xy11z2yyzxy0y
  • Kí tự phân biệt: {x, y, 1, z, 2, 0} → 6

  • Kí tự xuất hiện nhiều nhất: y → 5 lần
    👉 Kết quả: 6 * 5 = 30

Ví dụ 2

STRONG.INP
ggggg
  • Phân biệt: 1

  • Xuất hiện nhiều nhất: 5
    👉 Kết quả: 1 * 5 = 5


⏱️ Phân tích độ phức tạp

  • Duyệt xâu độ dài n đúng 1 lần

👉 Thời gian:

O(n)

👉 Bộ nhớ:

O(k)≤O(n)

(với k là số kí tự phân biệt)


✅ Nhận xét theo chuẩn HSG

✔ Thuật toán đơn giản – đúng bản chất
✔ Không dùng thư viện nâng cao
✔ Chạy rất nhanh với n ≤ 1000
✔ Dễ trình bày trong bài thi

📌 Giải Đáp Án Bài 3: Tổng dòng cột (SUM)

🔍 Nội dung đề bài (tóm tắt)

  • Cho ma trận a gồm m dòng và n cột.

  • Tạo ma trận b theo công thức:

bij=(tổng doˋng i của a+tổng cột j của a)−aijb_{ij}

👉 Yêu cầu

Tìm giá trị nhỏ nhất trong ma trận b.


🧠 Tư duy giải (rất quan trọng – hay ra thi)

Nếu làm ngây thơ:

  • Với mỗi ô (i, j) lại đi tính tổng dòng + tổng cột
    ❌ → chậm: O(m*n*(m+n))dễ TLE

👉 Cách làm đúng chuẩn HSG:

Bước 1:

  • Tính tổng từng dòng → mảng tong_dong[i]

  • Tính tổng từng cột → mảng tong_cot[j]

Bước 2:

  • Với mỗi ô (i, j):

bij=tong_dong[i]+tong_cot[j]−a[i][j]

  • Cập nhật giá trị nhỏ nhất

⚡ Không cần lưu ma trận b → tiết kiệm bộ nhớ

Code Python (chuẩn thi)

import sys

sys.stdin = open("SUM.INP", "r")
sys.stdout = open("SUM.OUT", "w")

# Đọc m, n
m, n = map(int, sys.stdin.readline().split())

# Đọc ma trận a
a = []
for _ in range(m):
    a.append(list(map(int, sys.stdin.readline().split())))

# Tính tổng từng dòng
tong_dong = [0] * m
for i in range(m):
    tong_dong[i] = sum(a[i])

# Tính tổng từng cột
tong_cot = [0] * n
for j in range(n):
    for i in range(m):
        tong_cot[j] += a[i][j]

# Tìm giá trị nhỏ nhất trong ma trận b
INF = 10**18
min_b = INF

for i in range(m):
    for j in range(n):
        b_ij = tong_dong[i] + tong_cot[j] - a[i][j]
        if b_ij < min_b:
            min_b = b_ij

print(min_b)

✍️ Giải thích code ngắn gọn

  • tong_dong[i]: tổng dòng i

  • tong_cot[j]: tổng cột j

  • Với mỗi ô (i, j):

    • Áp dụng đúng công thức đề

    • Cập nhật min_b

  • Không cần tạo ma trận btối ưu


⏱️ Phân tích độ phức tạp

  • Tính tổng dòng: O(mn)

  • Tính tổng cột: O(mn)

  • Duyệt tìm min: O(mn)

👉 Tổng thời gian:

O(m×n)

👉 Bộ nhớ:

O(m+n)


✅ Nhận xét chuẩn HSG

✔ Áp dụng tiền xử lý (precompute)
✔ Tránh lặp thừa – tư duy tối ưu
✔ Phù hợp ma trận lớn
✔ Rất dễ ăn trọn 4 điểm

📌 Bài 4: Xâu lặp (SUBSTR)

🔍 Tóm tắt dạng bài (chuẩn đề Tiền Giang)

  • Cho một xâu s (chỉ gồm chữ thường và chữ số, không có khoảng trắng)

  • Xâu có độ dài ≤ 10^3

  • Yêu cầu:
    👉 Tìm xâu con dài nhất xuất hiện ít nhất 2 lần trong s
    (cho phép chồng lấn)

Đây là dạng bài xâu lặp (longest repeated substring) – rất hay ra thi tỉnh.


🧠 Tư duy giải (đúng mức THCS – không dùng suffix array)

|s| ≤ 1000, ta có thể dùng cách duyệt độ dài + kiểm tra trùng:

Ý tưởng:

  1. Duyệt độ dài xâu con L từ lớn xuống nhỏ

  2. Với mỗi L, duyệt tất cả các xâu con độ dài L

  3. Dùng set để kiểm tra:

    • Nếu một xâu con đã xuất hiện → tìm được đáp án

  4. Gặp độ dài lớn nhất đầu tiên → dừng luôn

👉 Cách này dễ cài, dễ trình bày, đủ nhanh cho đề tỉnh.

import sys

sys.stdin = open("SUBSTR.INP", "r")
sys.stdout = open("SUBSTR.OUT", "w")

s = sys.stdin.readline().strip()
n = len(s)

ket_qua = ""

# Duyệt độ dài xâu con từ lớn xuống nhỏ
for L in range(n - 1, 0, -1):
    tap_con = set()
    found = False

    for i in range(n - L + 1):
        sub = s[i:i+L]
        if sub in tap_con:
            ket_qua = sub
            found = True
            break
        tap_con.add(sub)

    if found:
        break

print(ket_qua)

✍️ Giải thích code

  • Duyệt L từ n-11
    → đảm bảo lấy xâu dài nhất

  • Với mỗi L:

    • Cắt các xâu con s[i:i+L]

    • Dùng set để kiểm tra trùng

  • Khi phát hiện xâu lặp đầu tiên → in ra ngay


🧪 Ví dụ minh họa

Ví dụ

SUBSTR.INP
abababa

Các xâu lặp dài nhất:

  • "ababa" xuất hiện 2 lần (chồng lấn)

👉 Kết quả:

SUBSTR.OUT
ababa

⏱️ Phân tích độ phức tạp

  • Duyệt độ dài: O(n)

  • Với mỗi độ dài, duyệt xâu con: O(n)

  • Cắt xâu + set: O(n)

👉 Tổng:

O(n3) (với n≤1000 là chấp nhận được)

👉 Bộ nhớ:

O(n2)


✅ Nhận xét chuẩn HSG

✔ Không dùng thuật toán nâng cao (suffix array, Z, KMP)
✔ Dễ hiểu – dễ chép vào bài thi
✔ Đủ nhanh với dữ liệu đề tỉnh
✔ Trình bày rất “ăn điểm”

📌Giải Đáp Án Bài 5: Phần thưởng (GIFT)

🔍 Phân tích đề bài

  • một dãy số là giá trị các phần thưởng (sắp theo một hàng).

  • Mỗi phần thưởng có giá trị từ 1 đến 10^9.

  • An muốn chọn một đoạn liên tiếp sao cho:
    👉 giá trị tăng dần liên tiếp
    (tức là: số sau lớn hơn số trước).

👉 Yêu cầu

Tìm độ dài lớn nhất của đoạn tăng dần liên tiếp.

📌 Lưu ý:

  • Chỉ xét liên tiếp

  • Không cần tăng đúng 1, chỉ cần lớn hơn


🧠 Tư duy giải (rất chuẩn thi)

Đây là bài:

Dãy con tăng liên tiếp dài nhất

👉 Không cần quy hoạch động phức tạp.

Ý tưởng:

  • Duyệt từ trái sang phải

  • Nếu a[i] > a[i-1]:

    • tăng độ dài đoạn hiện tại

  • Ngược lại:

    • bắt đầu đoạn mới

  • Luôn cập nhật độ dài lớn nhất

import sys

sys.stdin = open("GIFT.INP", "r")
sys.stdout = open("GIFT.OUT", "w")

# Đọc dãy phần thưởng
a = list(map(int, sys.stdin.readline().split()))
n = len(a)

# Nếu dãy rỗng (trường hợp hiếm)
if n == 0:
    print(0)
else:
    max_len = 1      # độ dài lớn nhất
    cur_len = 1      # độ dài đoạn hiện tại

    for i in range(1, n):
        if a[i] > a[i - 1]:
            cur_len += 1
        else:
            cur_len = 1

        if cur_len > max_len:
            max_len = cur_len

    print(max_len)

✍️ Giải thích code

  • cur_len: độ dài đoạn tăng dần đang xét

  • max_len: kết quả lớn nhất

  • Khi gặp a[i] ≤ a[i-1]:

    • chuỗi tăng bị phá vỡ → reset cur_len = 1

  • Duyệt xong là ra kết quả


🧪 Kiểm tra ví dụ đề bài

Ví dụ 1

GIFT.INP
2 4 3 5 7 8 6

Đoạn tăng dài nhất:

3 5 7 8

👉 Độ dài = 4


Ví dụ 2

GIFT.INP
1 5 4 3 5 6 6 5 8 6

Đoạn tăng dài nhất:

3 5 6

👉 Độ dài = 3


⏱️ Phân tích độ phức tạp

  • Duyệt dãy 1 lần

👉 Thời gian:

O(n)

👉 Bộ nhớ:

O(1)


✅ Nhận xét chuẩn HSG

✔ Bài điển hình – dễ ăn điểm
✔ Không cần mảng phụ
✔ Chạy rất nhanh dù n lớn
✔ Trình bày rõ ràng, sạch sẽ

Nếu bạn thấy hay ! xin bạn 1 phút ! vui lòng đánh giá 5 sao cho trang website của chúng tôi ! để có động lực làm thêm nhiều bài hay nữa ! cảm ơn quý khách nhé !

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

 

Khóa học Python online từ cơ bản đến nâng cao

Câu hỏi thường gặp về đề thi HSG Tin 9:

  • Bộ 76 đề thi HSG Tin 9 này có kèm đáp án không? Dạ có, toàn bộ 76 đề thi trong bộ sưu tập đều đi kèm đáp án chi tiết và hướng dẫn giải thuật bằng các ngôn ngữ phổ biến như Pascal, C++, Python.

  • Tài liệu này có bao gồm đề thi của những năm gần đây không? Có, bộ tài liệu được cập nhật các đề thi HSG cấp tỉnh mới nhất (năm học 2023-2024 và 2024-2025) từ các tỉnh thành có phong trào Tin học mạnh.

  • Tôi có thể tải file Word để về chỉnh sửa không? Được ạ, link tải bao gồm cả định dạng PDF để xem nhanh và file Word (.docx) để quý thầy cô và các bạn học sinh tiện trích dẫn, chỉnh sửa đề bài.

  • Luyện đề thi HSG Tin 9 nên tập trung vào ngôn ngữ nào? Hiện nay hầu hết các tỉnh đã chuyển sang C++ và Python. Tuy nhiên, bộ đề vẫn giữ lại các lời giải bằng Pascal cho những địa phương chưa thay đổi hình thức thi.

 

 

 

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

Tải 200 Bài lập trình python có lời giải cơ bản đến nâng cao pdf

Phần 2: Tải ngay 200 Bài lập trình Python có lời giải cơ bản đến nâng cao PDF

Bạn đang bắt đầu hành trình chinh phục ngôn ngữ lập trình Python? Bạn đã nắm vững lý thuyết nhưng lại lúng túng khi bắt tay vào viết code thực tế? Tài liệu “200 Bài lập trình Python có lời giải cơ bản đến nâng cao PDF” chính là chiếc chìa khóa vàng giúp bạn chuyển hóa kiến thức thành kỹ năng thực chiến.

Phần 1: 100  Bài lập trình Python có lời giải cơ bản đến nâng cao PDF

Phần 2: 200  Bài lập trình Python có lời giải cơ bản đến nâng cao PDF

Tại sao bạn cần bộ 200 bài tập Python này?

Lập trình là kỹ năng cần sự rèn luyện liên tục. Theo các chuyên gia IT, sai lầm lớn nhất của người mới học là đọc quá nhiều lý thuyết mà thiếu thực hành. Bộ tài liệu PDF này được tổng hợp và chọn lọc kỹ lưỡng nhằm giải quyết các vấn đề sau:

  • Phân loại rõ ràng: Bài tập đi từ cấp độ “vỡ lòng” (Level 1) đến các thuật toán phức tạp (Level 3-4).

  • Có lời giải chi tiết (Source code): Giúp bạn so sánh, đối chiếu và tối ưu hóa cách viết code của mình.

  • Đa dạng chủ đề: Bao quát từ xử lý chuỗi, vòng lặp, đến hướng đối tượng (OOP) và xử lý file.

  • Định dạng PDF tiện lợi: Dễ dàng tải về, in ấn hoặc xem offline trên mọi thiết bị.

Nội dung chi tiết trong bộ tài liệu PDF

Bộ tài liệu được chia làm 3 giai đoạn chính, phù hợp với lộ trình phát triển tư duy lập trình:

1. Giai đoạn Cơ bản (Level 1)

Đây là phần khởi động dành cho người mới bắt đầu (newbie). Các bài tập tập trung vào:

  • Cú pháp cơ bản của Python.

  • Các kiểu dữ liệu: Number, String, List, Tuple, Dictionary.

  • Cấu trúc điều khiển: If-Else, Vòng lặp For/While.

  • Nhập xuất dữ liệu cơ bản.

2. Giai đoạn Trung cấp (Level 2)

Sau khi đã quen tay, bạn sẽ bước vào các bài toán yêu cầu tư duy logic cao hơn:

  • Xây dựng và sử dụng Hàm (Function).

  • Các module toán học (Math, Random).

  • Xử lý chuỗi nâng cao và Biểu thức chính quy (Regex).

  • Thao tác với mảng đa chiều.

3. Giai đoạn Nâng cao (Level 3 & Level 4)

Phần này dành cho những bạn muốn tối ưu code và hiểu sâu về Python:

  • Lập trình hướng đối tượng (Class, Object, Inheritance).

  • Thuật toán sắp xếp và tìm kiếm.

  • Xử lý File (Đọc/Ghi file text, csv, json).

  • Xử lý ngoại lệ (Try/Except).

Lưu ý: Tất cả các bài tập đều đi kèm lời giải mẫu (solution) để bạn tham khảo sau khi tự giải.

Bài 0101. In hình tam giác vuông cân bằng dấu *?

 

h=int(input())
for i in range(1,h+1):
    print(i*'*')

Bài 0102. In hình chữ nhật đặc bằng dấu *?

 

a,b=map(int,input().split())
for i in range(b):
    print(a*'*')

Bài 0103. In tam giác số?

 

a=int(input())
b=[]
for i in range(1,a+1):
    b.append(i)
for i in range(1,len(b)+1):
    print(*b[:i])

Bài 0104. In ra bảng cửu chương của số tự nhiên n theo định dạng phép nhân?

 

n=int(input())
for i in range(1,10):
    print(i,'x',n,'=',n*i)

Bài 0105. Đếm ước của một số nguyên n?

 

n=int(input())
dem=0
for i in range(1,n+1):
    if n%i==0:
        dem+=1
print(dem)

0106. Kiểm tra n có phải là số nguyên tố (Prime)?

 

def ktnt(n):
    i=2
    while i*i<=n and n%i!=0:
        i+=1
    return i*i>n and n>1
a=int(input())
if ktnt(a):
    print('Yes')
else:
    print('No')

0107. Kiểm tra một số nguyên có là số hoàn hảo (Perfect)?

 

def kthh(n):
    tong=0
    for i in range(1,n):# cach 2: nhanh hon range(1, int(n/2)+1) chi chay phan nua
        if n%i==0:
            tong+=i
    return tong
n=int(input())
tong=kthh(n)
if tong==n:
    print('Yes')
else:
    print('No')

0108. Kiểm tra một số nguyên có là số tam giác (Triangular)?

 

def kttg(n):
    tong=0
    for i in range(1,int(n/2)+1):
        tong+=i
        if tong==n:
            return True
    return False
n=int(input())
if kttg(n):
    print('Yes')
else:
    print('No')

0109. Kiểm tra một số nguyên có là số đối xứng (Palindrome)?

 

a=input()
if a==a[::-1]:
    print('Yes')
else:
    print('No')

0110. Kiểm tra một số nguyên có là số Chen?

 

def ktnt(n):
    i=2
    while i*i<=n and n%i!=0:
        i+=1
    return  i*i>n and n>1
a=int(input())
if ktnt(a+2) and ktnt(a):
    print('Yes')
else:
    print('No')

0111. Kiểm tra một số nguyên có là số kỳ ảo (Magic)?

 

def so_magic(s):
    for i in range(1,len(s)+1):
        sub=int(s[:i])
        if sub%i!=0:
            return False
    return True
s=input()
if so_magic(s):
    print('Yes')
else:
    print('No')

 

Nguồn : https://xn--300bicode-t1a.vn/

Tác Giả: Trần Phí An Bình

Tải xuống tài liệu PDF (Full Source Code)

Đừng để việc học lập trình dừng lại ở lý thuyết. Hãy tải ngay bộ tài liệu này và bắt đầu “code” ngay hôm nay!

[ [DOWNLOAD] 200 BÀI LẬP TRÌNH PYTHON CÓ LỜI GIẢI (PDF) ]

Hướng dẫn sử dụng:

  1. Tải file về máy.

  2. Mở đề bài và tự làm trước.

  3. Nếu bí hoặc gặp lỗi, hãy tham khảo phần lời giải (solution) đi kèm.

  4. Cố gắng tối ưu code ngắn gọn hơn cả lời giải mẫu.

Chúc các bạn học tốt và sớm trở thành một Python Developer chuyên nghiệp!

Câu hỏi thường gặp về bộ 200 bài tập Python (FAQ)

1. Tài liệu này có phù hợp cho người mới bắt đầu (newbie) không?

Hoàn toàn phù hợp. Bộ 200 bài tập này được thiết kế theo lộ trình thăng tiến rõ ràng, đi từ Level 1 (Cơ bản) đến Level 4 (Nâng cao). Người mới bắt đầu có thể làm quen từ các bài toán nhập xuất dữ liệu, câu lệnh điều kiện đơn giản trước khi chuyển sang các thuật toán phức tạp hơn ở phần sau.

2. Tôi có thể xem lời giải chi tiết ở đâu?

Mỗi bài tập trong file PDF đều đi kèm với Source Code (mã nguồn) lời giải mẫu ở ngay bên dưới đề bài. Để đạt hiệu quả tốt nhất, bạn nên tự mình giải bài toán trước, sau đó mới đối chiếu với đáp án để học cách tối ưu logic và cú pháp.

3. Tải bộ tài liệu PDF này có mất phí không?

Không, bộ tài liệu “200 Bài lập trình Python có lời giải” này được chia sẻ hoàn toàn miễn phí nhằm hỗ trợ cộng đồng học lập trình tại Việt Nam. Bạn có thể thoải mái tải về, lưu trữ trên máy tính hoặc in ra giấy để tiện ôn tập.

4. Tôi cần cài đặt phần mềm gì để chạy code Python?

Để thực hành các bài tập này, bạn cần cài đặt Python (tải từ python.org). Về công cụ viết code (IDE), bạn có thể dùng IDLE mặc định, hoặc các phần mềm chuyên nghiệp hơn như Visual Studio Code (VS Code) hoặc PyCharm Community để hỗ trợ gợi ý code và gỡ lỗi tốt hơn.

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

Tổng Hợp Hàm Python Thi Tỉnh Và Thi Vào Lớp 10 Chuyên Tin

Tổng Hợp Các Hàm Python “Cốt Lõi” Khi Thi HSG Tỉnh Và Vào 10 Chuyên Tin ( Mới Nhất – Chọn Lọc – Cập Nhật Thường Xuyên )

  • Cập nhật mới nhất ngày 11/4 /2026
  • Trong các kỳ thi học sinh giỏi Tin học cấp huyện – cấp tỉnhthi tuyển sinh vào lớp 10 chuyên Tin, Python là ngôn ngữ được sử dụng rất phổ biến. Tuy nhiên, đề thi không yêu cầu viết code dài, mà yêu cầu:
    • Nắm chắc hàm chuẩn

    • Biết áp dụng nhanh đúng chỗ

    • Tối ưu tư duy + thời gian làm bài

Tải về ngay tài liệu Tổng Hợp Hàm Python Thi Tỉnh Và Thi Vào Lớp 10 Chuyên Tin

Tải bằng google driver

 

Các hàm quan trọng ôn thi vào Chuyên Tin 1 Các hàm quan trọng ôn thi vào Chuyên Tin 2

 

 

  • Bài viết này tổng hợp đầy đủ các hàm Python “xương sống” thường xuất hiện trong đề thi tỉnh và đề thi chuyên, được chia theo nhóm bài toán, kèm ví dụ sát đề thật.
  • Tác giả: [Thầy Tấn Dân]
  • Chuyên mục: Lập trình thi đấu Python cấp Tỉnh, Ôn thi Chuyên Tin.
  • Trong những năm gần đây, Python đã trở thành ngôn ngữ được cho phép và ưa chuộng trong các kỳ thi Học sinh giỏi (HSG) cấp Tỉnhthi vào lớp 10 Chuyên Tin nhờ cú pháp ngắn gọn. Tuy nhiên, tốc độ thực thi của Python chậm hơn C++. Để bù đắp điều này, việc nắm vững các hàm có sẵn (built-in functions) và các thư viện chuẩn là chìa khóa để code nhanh hơn và tối ưu thời gian chạy (Time Limit).
  • Bài viết này sẽ tổng hợp “kho vũ khí” các hàm Python quan trọng nhất giúp bạn chinh phục các bài toán xử lý chuỗi, số học và cấu trúc dữ liệu.

1. Tăng Tốc Nhập/Xuất Dữ Liệu (Fast I/O)

Trong các bài thi, dữ liệu đầu vào có thể lên tới $10^5$ hoặc $10^6$ dòng. Hàm input() thông thường có thể khiến bạn bị lỗi TLE (Time Limit Exceeded).

Hãy sử dụng sys.stdin:

Python

import sys

# Thay thế input() bằng sys.stdin.readline
input = sys.stdin.readline

# Đọc mảng số nguyên trên một dòng
a = list(map(int, input().split()))

Lưu ý: Khi dùng sys.stdin.readline, chuỗi nhận được sẽ kèm theo ký tự xuống dòng \n. Bạn có thể cần dùng .strip() để loại bỏ nó.


2. Các Hàm Xử Lý Chuỗi (String Manipulation)

Đề thi cấp Tỉnh và vào 10 thường xuyên có bài tập xử lý xâu. Python là “vua” ở mảng này.

Cắt và Gộp Chuỗi

  • s.split(): Tách chuỗi thành list (mặc định tách theo khoảng trắng).

  • " ".join(list): Gộp list thành chuỗi.

Tìm Kiếm và Thay Thế

  • s.find(sub): Trả về chỉ số đầu tiên tìm thấy, nếu không có trả về -1.

  • s.count(sub): Đếm số lần xuất hiện của chuỗi con.

  • s.replace(old, new): Thay thế chuỗi con.

Kỹ Thuật Slicing (Cắt lát)

Đây là kỹ thuật cực mạnh của Python:

  • s[::-1]: Đảo ngược chuỗi (Cực hay dùng để kiểm tra số Palindrome).

  • s[start:end:step]: Cắt chuỗi linh hoạt.


3. Thư Viện Toán Học (math)

Đừng tự viết hàm tính toán nếu Python đã có sẵn, vì hàm của thư viện C-based chạy nhanh hơn nhiều.

Python

import math
  • math.gcd(a, b): Tìm ước chung lớn nhất (UCLN).

  • math.lcm(a, b): Tìm bội chung nhỏ nhất (BCNN) (Lưu ý: Chỉ có từ Python 3.9 trở lên).

  • math.isqrt(n): Tính căn bậc 2 nguyên (trả về phần nguyên), nhanh và chính xác hơn int(math.sqrt(n)) với số lớn.

  • math.ceil(x) / math.floor(x): Làm tròn lên / xuống.

  • math.factorial(n): Tính giai thừa $n!$.


4. Xử Lý Danh Sách (List) & Sắp Xếp

Sắp xếp (Sorting) là bài toán kinh điển. Python sử dụng thuật toán Timsort với độ phức tạp $O(N \log N)$.

Hàm Sắp Xếp

  • a.sort(): Sắp xếp trực tiếp trên list a (làm thay đổi a).

  • sorted(a): Trả về một list mới đã sắp xếp, giữ nguyên a.

  • Sắp xếp ngược: Thêm tham số reverse=True.

Sắp Xếp Tùy Chọn (Lambda)

Ví dụ: Sắp xếp các cặp số (x, y) theo y tăng dần:

Python

points = [(1, 3), (4, 1), (2, 2)]
points.sort(key=lambda x: x[1])
# Kết quả: [(4, 1), (2, 2), (1, 3)]

List Comprehension (Tạo List nhanh)

Thay vì dùng vòng lặp for, hãy dùng cách này để code ngắn gọn:

Python

# Tạo mảng bình phương các số chẵn từ 0 đến 9
sq = [x**2 for x in range(10) if x % 2 == 0]

5. “Vũ Khí Bí Mật”: Thư Viện collectionsitertools

Đây là phần phân loại thí sinh. Biết dùng các thư viện này sẽ giúp bạn giải quyết bài toán phức tạp trong vài dòng code.

collections.Counter (Đếm tần suất)

Giải quyết bài toán “đếm số lần xuất hiện của phần tử” trong $O(N)$.

Python

from collections import Counter

a = [1, 2, 2, 3, 1, 1]
dem = Counter(a)
print(dem[1]) # Kết quả: 3 (số 1 xuất hiện 3 lần)
print(dem.most_common(1)) # Trả về phần tử xuất hiện nhiều nhất

collections.deque (Hàng đợi hai đầu)

Dùng cho thuật toán BFS hoặc các bài toán cần thêm/xóa phần tử ở đầu mảng (List thường xóa đầu mất $O(N)$, deque chỉ mất $O(1)$).

itertools.permutations & combinations

Dùng để sinh hoán vị và tổ hợp (thay thế cho quay lui – backtracking ở các bài toán có N nhỏ).

Python

from itertools import permutations
# Sinh tất cả hoán vị của [1, 2, 3]
perms = list(permutations([1, 2, 3]))

6. Mẹo Nhỏ Nhưng “Có Võ”

  1. Nới rộng giới hạn đệ quy: Python mặc định giới hạn độ sâu đệ quy khoảng 1000. Với các bài DFS hoặc quy hoạch động đệ quy, hãy thêm dòng này đầu file:

    Python

    import sys
    sys.setrecursionlimit(10**6)
    
  2. Sử dụng hàm set(): Để loại bỏ phần tử trùng lặp hoặc kiểm tra sự tồn tại trong $O(1)$ thay vì $O(N)$ của list.

  3. Hàm zip(): Duyệt song song nhiều list cùng lúc.


I. Các hàm đặc biệt quan trọng – Hay ra nhất trong đề thi

1) các hàm chữ:

  1. s=s.split() #tách các chữ mất khoản cách
  2. s=s.split(‘,’) # tách các phần tử bởi dấu phẩy (, ) (.) (: ) tùy bài
  3. isdigit() # các số 
  4. islower() ( chữ thường )
  5. isupper() (chữ hoa )
  6. sorted() ( Các từ theo thứ tự từ điển)
  7. print(s1.count(s2)) ( điếm trong chuỗi )
  8. s[i].isalnum() lấy kiểu chữ và số ( trừ ký tự đặc biệt )
  9. not s[i].isalnum() lấy ký tự đặc biệt
  10. s=’’.join(a)# chuyển mảng sang chuỗi
  11. a=list(s) # chuyển chuỗi sang mảng
  12. vt=c.index(Max)
  13. vt=s.rfind(‘.’)# tìm vị trí dấu chấm cuối
  14. vt=s.find(‘.’)# tìm vị trí đầu trong chuỗi
  15. abs( a- b) ( hàm trị tuyệt đối)
  16. sqrt ( a) căn bật 2 nhớ import math
  17. BCNN=abs(a*b)/ucln(a,b) # Bội số chung lớn nhất
  18. Ucln=math.gcd(a,b) #Ước số chung lớn nhất

print(s[0].zfill(2),’:’,s[1].zfill(2),’:’,s[2].zfill(2),sep=”)# định dạng thêm số 0 ở phía trước zfill(2) ; số 2 phần chục; 3; phần trăm; 4; phần ngàn,…

7. Kỹ Thuật Lọc Dữ Liệu Bằng “Biểu Thức Chính Quy” (Regex)

Trong đề thi, đôi khi dữ liệu vào là một xâu hỗn độn chứa cả chữ và số (ví dụ: a12b34cd56), và yêu cầu bạn tách riêng số hoặc chữ. Thay vì dùng vòng lặp for để kiểm tra từng ký tự, ta dùng thư viện re (Regular Expression).

Lấy từng số, bỏ chữ (Hoặc ngược lại)

Để sử dụng, bắt buộc phải import re.

Python

import re

s = "hoc123sinh456gioi789"

# 1. Lấy số, bỏ chữ:
# '[^0-9]+' nghĩa là: Những ký tự KHÔNG phải số (0-9)
# Thay thế những cái không phải số bằng khoảng trắng ' ', sau đó split ra.
nums = re.sub('[^0-9]+', ' ', s).split()
# Kết quả nums: ['123', '456', '789'] (Dạng chuỗi)

# 2. Lấy chữ, bỏ số:
# '[^a-zA-Z]+' nghĩa là: Những ký tự KHÔNG phải chữ cái (a-z, A-Z)
words = re.sub('[^a-zA-Z]+', ' ', s).split()
# Kết quả words: ['hoc', 'sinh', 'gioi']

Tại sao nó “xịn”? Cách này xử lý được cả trường hợp số âm hoặc số thực nếu bạn chỉnh pattern một chút, và nó nhanh hơn nhiều so với việc viết hàm if kiểm tra từng ký tự.


8. Sửa Đổi và Làm Sạch Chuỗi (replace & strip)

Nhóm hàm này dùng để chuẩn hóa dữ liệu đầu vào (ví dụ: xoá khoảng trắng thừa, thay thế từ khóa).

Hàm thay thế (replace)

Dùng để thay thế tất cả các chuỗi con tìm thấy.

Python

s = "  hello world  "

# Xóa toàn bộ khoảng trắng trong chuỗi
# Kết quả: "helloworld"
clean_s = s.replace(" ", "") 

# Thay thế từ
s2 = "python is hard"
s2 = s2.replace("hard", "easy") 
# Kết quả: "python is easy"

Hàm cắt khoảng trắng (strip)

Rất quan trọng khi đọc dữ liệu từ input() để tránh lỗi do khoảng trắng thừa ở đầu/cuối dòng.

  • s.strip(): Cắt khoảng trắng 2 đầu.

  • s.lstrip(): Cắt bên trái (đầu dòng).

  • s.rstrip(): Cắt bên phải (cuối dòng).


9. Các Kỹ Thuật Sắp Xếp và Đảo Ngược

Cần phân biệt rõ giữa Sắp xếp (Sort)Đảo ngược (Reverse).

Sắp xếp (Sort)

Đưa các phần tử về trật tự tăng dần hoặc giảm dần.

Python

a = [3, 1, 5, 2]

# Cách 1: a.sort()
# Sắp xếp trực tiếp lên biến a. Không trả về dữ liệu mới.
a.sort() 
print(a) # [1, 2, 3, 5]

# Cách 2: sorted(a)
# Trả về một list MỚI, list a cũ giữ nguyên.
b = sorted(a, reverse=True) # Sắp xếp giảm dần
print(b) # [5, 3, 2, 1]

Đảo ngược (Reverse – Slicing)

Đây không phải là sắp xếp lại giá trị, mà chỉ là lật ngược vị trí (đuôi lên đầu).

Python

s = "ABCDE"
rev_s = s[::-1] 
# Kết quả: "EDCBA"

Kiểm tra đối xứng (Palindrome)

Sử dụng kỹ thuật slicing [::-1] để kiểm tra cực nhanh.

Python

def ktdx(n):
    # Luôn chuyển về chuỗi trước khi đảo ngược
    s = str(n) 
    return s == s[::-1]

print(ktdx(12321)) # True
print(ktdx(123))   # False

10. Tìm Giá Trị Lớn Nhất / Nhỏ Nhất (Min/Max Nâng Cao)

Ngoài việc tìm số lớn nhất/nhỏ nhất thông thường, Python cho phép tìm theo tiêu chí riêng bằng tham số key.

Min/Max cơ bản

Python

arr = [10, 5, 8, 90]
print(max(arr)) # 90
print(min(arr)) # 5

Min/Max theo độ dài (Rất hay thi)

Ví dụ: Tìm từ dài nhất trong một câu.

Python

words = ["ha", "noi", "vietnam", "yeu"]

# Tìm chuỗi có độ dài (len) lớn nhất
longest = max(words, key=len)
print(longest) # "vietnam"

# Tìm chuỗi có độ dài nhỏ nhất
shortest = min(words, key=len)
print(shortest) # "ha"

Giải thích: key=len bảo Python rằng: “Đừng so sánh chữ cái a,b,c… hãy so sánh độ dài của chúng để quyết định ai lớn nhất”.


Tổng kết nhanh các hàm cần nhớ:

Chức năngHàm/Cú phápGhi chú
Lọc sốre.sub('[^0-9]+', ' ', s)Cần import re
Thay thếs.replace(old, new)Thay thế tất cả
Cắt khoảng trắngs.strip()Chỉ cắt 2 đầu
Sắp xếpa.sort() hoặc sorted(a)sort sửa list gốc, sorted tạo list mới
Đảo ngượcs[::-1]Dùng để kiểm tra Palindrome
Max theo dàimax(a, key=len)Tìm chuỗi dài nhất

 

 

9) lấy điểm ra sắp xếp:

 

Def laydiem(s):

          s=s.split()

          return float(s[-1])

kq=sorted(a,key=laydiemm,reverse=True)

for i in range(len(kq)):

          x=kq[i].split()

          diem=float(x[-1])

          x.pop(-1)

          hoten=’’.join(x)

          print(hoten,’%0.1f’%diem)
2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

73 Đề thi HSG Tin học Python THCS cấp tỉnh Tiền Giang có ĐÁP ÁN (Mới & Chọn Lọc)

Nếu bạn đang ôn thi học sinh giỏi Tin học THCS cấp tỉnh Tiền Giang, đặc biệt là thi lập trình Python, thì bài viết này sinh ra là dành cho bạn.

Trong bài này, Vi Tính Tân Dân đã tổng hợp 73 đề thi HSG Tin học Python THCS cấp tỉnh Tiền Giang, kèm đáp án – code giải chi tiết – giải thích thuật toán rõ ràng, bám sát đúng cấu trúc đề thi thực tế của Sở GD&ĐT Tiền Giang.

👉 Phù hợp cho:

  • Học sinh lớp 6 – 9 ôn thi HSG Tin học

  • Học sinh luyện thi vào lớp 10 chuyên Tin

  • Giáo viên, phụ huynh bồi dưỡng học sinh năng khiếu Tin học

 

73 Đề thi HSG Tin học Python THCS cấp tỉnh Tiền Giang 73 Đề thi HSG Tin học Python THCS cấp tỉnh Tiền Giang 73 Đề thi HSG Tin học Python THCS cấp tỉnh Tiền Giang

 


🎯 Vì sao nên luyện bộ 73 đề thi HSG Tin học Python THCS cấp tỉnh Tiền Giang này?

Không giống các bộ đề tràn lan trên mạng, bộ đề này được chọn lọc kỹ, đảm bảo:

Đúng chuẩn đề thi Tin học THCS cấp tỉnh Tiền Giang
✅ Ngôn ngữ Python – đúng yêu cầu thi thực tế
✅ Có đáp án + code mẫu
✅ Giải thích tư duy thuật toán, không chỉ cho code
✅ Từ dễ → trung bình → khó, giúp nâng trình rõ rệt

👉 Rất nhiều học sinh học Python nhưng không biết ra đề thi thật trông như thế nào. Bộ đề này giúp bạn làm quen đề chuẩn – tránh bỡ ngỡ khi đi thi.


📚 Nội dung chính trong 73 đề thi HSG Tin học Python THCS

Bộ đề bao phủ toàn bộ kiến thức trọng tâm thường ra trong các kỳ thi HSG Tin học cấp tỉnh:

🔹 1. Xử lý số & toán học trong Python

    1. Đọc số nguyên x từ file NUM.INP.
    2. Duyệt hai số a và b trong phạm vi [1, x], đảm bảo a ≤ b.
    3. Kiểm tra điều kiện a * b == x và a / b ≥ 0.5.
    4. Nếu tìm thấy cặp (a, b) thỏa mãn, gán la_ket_doi = 1 và dừng vòng lặp.
    5. Ghi kết quả 1 vào NUM.OUT nếu x là số kết đôi, ngược lại ghi 0.

🔹 2. Xử lý ngày tháng năm

    1. Đọc dữ liệu từ file CUP.INP, bao gồm:
      • Ngày hiện tại (định dạng dd.mm.yyyy).
      • Số ngày cần cộng thêm.
    2. Chuyển đổi ngày hiện tại thành kiểu datetime.
    3. Cộng thêm số ngày vào ngày hiện tại bằng timedelta(days=so_ngay_them).
    4. Xuất kết quả với định dạng dd.mm.yyyy ra file CUP.OUT.

🔹 3. Chuỗi ký tự (String)

    1. Đọc dữ liệu từ file PART.INP, gồm:
      • n, L, R: số phần tử của mảng và khoảng cần kiểm tra.
      • Mảng a chứa n số nguyên.
    2. Duyệt qua từng phần tử a[i] của mảng:
      • Xét các chỉ số j trong phạm vi [i+L, i+R].
      • Nếu a[i] == a[j] + a[j-1], tăng biến đếm và dừng kiểm tra tiếp theo.
    3. Xuất kết quả ra file PART.OUT.

🔹 4. Xử lý Xâu

  • Đọc dữ liệu từ file PW.INP:
    • Số nguyên n là số xâu.
    • n xâu ký tự chứa chỉ các chữ cái thường (a-z).

      Sắp xếp các xâu theo độ dài tăng dần.

      Duyệt từng xâu trong danh sách:

    • Kiểm tra xem xâu đó có chứa tất cả các xâu khác hay không.
    • Nếu có, in ra xâu đó và dừng lại.

      Nếu không có xâu nào phù hợp, in -1.

🔹 5. Thuật toán cơ bản – nâng cao

    1. Đọc dữ liệu từ COVID.INP:
      • n: số người trên đường.
      • a: danh sách tọa độ của n người.
    2. Sắp xếp danh sách tọa độ theo thứ tự tăng dần.
    3. Tính toán khoảng cách giữa các vị trí:
      • Khoảng cách nhỏ nhất giữa hai người gần nhau nhất.
      • Khoảng cách lớn nhất giữa người đầu và người cuối.
    4. Tính số nhóm nhiễm bệnh dựa trên khoảng cách:
      • Tối thiểu: nếu khoảng cách nhỏ nhất là d, thì nhóm nhiễm bệnh sẽ là (d // 2) + 1.
      • Tối đa: nếu khoảng cách lớn nhất là D, thì nhóm nhiễm bệnh sẽ là (D // 2) + 1.
    5. In kết quả.

🧠 Có gì trong phần ĐÁP ÁN & CODE GIẢI?

Điểm mạnh nhất của bộ tài liệu này là không chỉ có đáp án, mà còn:

✔️ Code Python rõ ràng – đúng chuẩn thi
✔️ Có import sys, đọc ghi file đúng format đề tỉnh
✔️ Giải thích từng bước tư duy
✔️ Phân tích độ phức tạp thuật toán
✔️ Chú thích bằng tiếng Việt dễ hiểu cho học sinh THCS

👉 Phù hợp cả với:

  • Học sinh tự học tại nhà

  • Giáo viên soạn tài liệu bồi dưỡng

  • Phụ huynh theo dõi quá trình học của con


🏆 Lợi ích khi luyện trọn bộ 73 đề này

📌 Nắm chắc cấu trúc đề thi HSG Tin học tỉnh Tiền Giang
📌 Tăng khả năng tư duy thuật toán – không học vẹt
📌 Làm quen cách trình bày code đúng chuẩn chấm thi
📌 Tự tin khi bước vào kỳ thi chính thức
📌 Rút ngắn rất nhiều thời gian ôn tập

👉 Rất nhiều học sinh từng đạt giải cấp huyện – cấp tỉnh đã luyện theo đúng dạng đề như trong bộ này.


👨‍🏫 Ai nên sử dụng bộ đề này?

✔️ Học sinh THCS yêu thích Tin học
✔️ Học sinh đang học Python để thi HSG
✔️ Học sinh ôn thi vào lớp 10 chuyên Tin
✔️ Giáo viên Tin học THCS
✔️ Trung tâm bồi dưỡng học sinh giỏi Tin học


🚀 Kết luận

Bộ 73 Đề thi HSG Tin học Python THCS cấp tỉnh Tiền Giang có ĐÁP ÁNtài liệu cực kỳ giá trị nếu bạn đang nghiêm túc theo đuổi con đường học sinh giỏi Tin học.

👉 Nếu bạn muốn:

  • Học đúng trọng tâm

  • Luyện đúng dạng đề

  • Hiểu bản chất thuật toán

👉 Đừng bỏ qua bộ đề này.

📌 Theo dõi vitinhtandan.com để cập nhật thêm:

  • Đề thi HSG Tin học mới

  • Code Python giải chi tiết

  • Tài liệu ôn thi chuyên Tin từ cơ bản đến nâng cao

ĐÁP ÁN CÂU 1: Số Kết Đôi

 

import sys

sys.stdin = open("NUM.INP", "r")
sys.stdout = open("NUM.OUT", "w")

# Doc so x
x = int(sys.stdin.readline().strip())

# Kiem tra so ket doi
la_ket_doi = 0
for a in range(1, x + 1):
    for b in range(a, x + 1):
        if a * b == x and a / b >= 0.5:
            la_ket_doi = 1
            break
    if la_ket_doi:
        break

# Ghi ket qua
print(la_ket_doi)

1️⃣ Ý tưởng thuật toán

Ta cần kiểm tra số nguyên dương x có tồn tại hai số nguyên dương a, b sao cho:

  • a×b=x

  • a≤b

  • a/b≥0.5

Nếu tồn tại ít nhất một cặp (a, b) thỏa mãn thì x là số kết đôi → in 1, ngược lại in 0.


2️⃣ Phân tích từng bước chương trình

🔹 Bước 1: Đọc dữ liệu

x = int(sys.stdin.readline().strip())

Đọc số nguyên dương x từ file NUM.INP.


🔹 Bước 2: Duyệt các cặp (a, b)

for a in range(1, x + 1):
for b in range(a, x + 1):
  • a chạy từ 1 đến x

  • b chạy từ a đến x → đảm bảo a ≤ b, tránh xét trùng cặp


🔹 Bước 3: Kiểm tra điều kiện số kết đôi

if a * b == x and a / b >= 0.5:
  • a * b == x → (a, b) là một cặp ước của x

  • a / b ≥ 0.5 → đúng điều kiện đề bài

👉 Nếu thỏa mãn:

  • Gán la_ket_doi = 1

  • Dừng vòng lặp ngay (không cần xét thêm)


🔹 Bước 4: Xuất kết quả

print(la_ket_doi)
  • In 1 nếu x là số kết đôi

  • In 0 nếu không tồn tại cặp nào thỏa


3️⃣ Độ phức tạp thuật toán

⏱️ Thời gian chạy

  • Vòng a: chạy tối đa x lần

  • Với mỗi a, vòng b: chạy tối đa x − a + 1 lần

👉 Trường hợp xấu nhất:

O(x^2)


💾 Bộ nhớ sử dụng

  • Chỉ dùng vài biến đơn giản (x, a, b, la_ket_doi)

  • Không dùng mảng hay cấu trúc phức tạp

👉 Độ phức tạp bộ nhớ:

O(1)


4️⃣ Nhận xét theo góc nhìn bài thi

✔️ Thuật toán:

  • Dễ hiểu

  • Dễ cài đặt

  • Phù hợp mức THCS – HSG cấp huyện/tỉnh

⚠️ Nhược điểm:

  • Với x lớn → chạy chậm do O(x²)

👉 Trong bài thi nâng cao, có thể tối ưu bằng cách chỉ duyệt đến √x, nhưng đáp án này hoàn toàn hợp lệ nếu đề không yêu cầu tối ưu.

ĐÁP ÁN CÂU 2: Word Cup

 

import sys
from datetime import datetime, timedelta

sys.stdin = open("CUP.INP", "r")
sys.stdout = open("CUP.OUT", "w")

# Doc du lieu
ngay_hien_tai = sys.stdin.readline().strip()
so_ngay_them = int(sys.stdin.readline().strip())

# Chuyen doi ngay thanh doi tuong datetime
ngay_hien_tai = datetime.strptime(ngay_hien_tai, "%d.%m.%Y")

# Cong them so ngay
ngay_tuong_lai = ngay_hien_tai + timedelta(days=so_ngay_them)

# In ket qua theo dinh dang dd.mm.yyyy
print(ngay_tuong_lai.strftime("%d.%m.%Y"))

1️⃣ Ý tưởng thuật toán

Bài toán yêu cầu:

  • Cho một ngày hiện tại (định dạng dd.mm.yyyy)

  • Cho số ngày cần cộng thêm

  • Tính và in ra ngày tương lai sau khi cộng số ngày đó

👉 Đây là bài toán xử lý ngày tháng, cần xét đúng:

  • Tháng có 28, 29, 30 hay 31 ngày

  • Năm nhuận

➡️ Ta sử dụng thư viện datetime của Python để xử lý chính xác và gọn nhẹ.


2️⃣ Phân tích từng bước chương trình

🔹 Bước 1: Đọc dữ liệu vào

ngay_hien_tai = sys.stdin.readline().strip()
so_ngay_them = int(sys.stdin.readline().strip())
  • ngay_hien_tai: chuỗi ngày theo dạng dd.mm.yyyy

  • so_ngay_them: số nguyên – số ngày cần cộng thêm


🔹 Bước 2: Chuyển chuỗi ngày sang kiểu datetime

ngay_hien_tai = datetime.strptime(ngay_hien_tai, "%d.%m.%Y")
  • strptime giúp chuyển chuỗi → đối tượng datetime

  • Định dạng %d.%m.%Y tương ứng:

    • %d: ngày

    • %m: tháng

    • %Y: năm

➡️ Sau bước này, Python hiểu đúng cấu trúc ngày tháng, kể cả năm nhuận.


🔹 Bước 3: Cộng thêm số ngày

ngay_tuong_lai = ngay_hien_tai + timedelta(days=so_ngay_them)
  • timedelta(days=so_ngay_them) biểu diễn khoảng thời gian cần cộng

  • Python tự động:

    • Chuyển tháng

    • Chuyển năm

    • Xử lý năm nhuận

➡️ Không cần tự viết kiểm tra ngày/tháng phức tạp.


🔹 Bước 4: In kết quả đúng định dạng

print(ngay_tuong_lai.strftime("%d.%m.%Y"))
  • strftime chuyển datetime → chuỗi

  • Định dạng đúng yêu cầu đề bài: dd.mm.yyyy


3️⃣ Độ phức tạp thuật toán

⏱️ Thời gian chạy

  • Đọc dữ liệu: O(1)

  • Chuyển đổi ngày: O(1)

  • Cộng ngày: O(1)

  • In kết quả: O(1)

👉 Tổng thời gian chạy:

O(1)


💾 Bộ nhớ sử dụng

  • Chỉ dùng vài biến kiểu đơn giản (datetime, int)

  • Không dùng mảng hay vòng lặp

👉 Độ phức tạp bộ nhớ:

O(1)


4️⃣ Nhận xét theo chuẩn bài thi

✔️ Ưu điểm:

  • Code ngắn gọn

  • Chính xác tuyệt đối (kể cả năm nhuận)

  • Tránh lỗi khi xử lý ngày/tháng

  • Rất phù hợp bài thi HSG THCS

⚠️ Lưu ý:

  • Cách làm này phụ thuộc thư viện datetime

  • Nếu đề cấm dùng thư viện, phải tự xử lý ngày tháng (phức tạp hơn)

ĐÁP ÁN CÂU 3: Phần Tử Điển Hình

 

import sys

sys.stdin = open("PART.INP", "r")
sys.stdout = open("PART.OUT", "w")

# Doc du lieu
n, L, R = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))

# Dem so phan tu dien hinh
dem = 0
for i in range(n):
    for j in range(i + L, min(i + R + 1, n)):  # Xet cac khoang tu L den R
        if a[i] == a[j] + a[j - 1]:
            dem += 1
            break  # Neu da la phan tu dien hinh thi khong xet tiep

# In ket qua
print(dem)

1️⃣ Ý tưởng thuật toán

Bài toán cho:

  • Số phần tử n

  • Hai số nguyên L, R

  • Mảng số nguyên a[0…n-1]

Một phần tử điển hình tại vị trí i là phần tử thỏa mãn:

∃ j sao cho i+L≤j≤i+R vaˋ a[i]=a[j]+a[j−1]\exists\ j \ \text{sao cho} \ i + L \le j \le i + R \ \text{và} \ a[i] = a[j] + a[j-1]

👉 Nhiệm vụ: đếm số phần tử điển hình trong mảng.


2️⃣ Phân tích từng bước chương trình

🔹 Bước 1: Đọc dữ liệu

n, L, R = map(int, sys.stdin.readline().split())
a = list(map(int, sys.stdin.readline().split()))
  • n: số phần tử của mảng

  • L, R: giới hạn khoảng xét

  • a: mảng gồm n số nguyên


🔹 Bước 2: Khởi tạo biến đếm

dem = 0

Biến dem dùng để đếm số phần tử điển hình.


🔹 Bước 3: Duyệt từng phần tử a[i]

for i in range(n):

Xét từng vị trí i trong mảng làm ứng viên phần tử điển hình.


🔹 Bước 4: Duyệt các chỉ số j phù hợp

for j in range(i + L, min(i + R + 1, n)):
  • j ≥ i + L

  • j ≤ i + R

  • j < n (tránh vượt chỉ số mảng)

👉 Đảm bảo đúng điều kiện đề bài.


🔹 Bước 5: Kiểm tra điều kiện điển hình

if a[i] == a[j] + a[j - 1]:

Nếu tồn tại ít nhất một j thỏa mãn thì:

  • a[i] là phần tử điển hình

  • Tăng biến đếm

  • Dừng vòng lặp j (không cần xét thêm)

dem += 1
break

🔹 Bước 6: In kết quả

print(dem)

In ra số lượng phần tử điển hình tìm được.


3️⃣ Độ phức tạp thuật toán

⏱️ Thời gian chạy

  • Vòng ngoài: chạy n lần

  • Vòng trong: tối đa R − L + 1 lần

👉 Trường hợp xấu nhất:

O(n×(R−L))\boxed{O(n \times (R – L))}

Nếu R − L gần n:

O(n2)


💾 Bộ nhớ sử dụng

  • Mảng a kích thước n

  • Một vài biến đơn giản

👉 Độ phức tạp bộ nhớ:

O(n)


4️⃣ Nhận xét theo chuẩn bài thi

✔️ Ưu điểm:

  • Code rõ ràng, dễ hiểu

  • Xử lý đúng yêu cầu đề bài

  • break giúp giảm thời gian chạy khi đã thỏa điều kiện

⚠️ Nhược điểm:

  • Với n lớn và R − L lớn → chương trình có thể chậm

  • Chưa tối ưu cho dữ liệu rất lớn

👉 Tuy nhiên, rất phù hợp với đề HSG THCS nếu không yêu cầu tối ưu cao.


5️⃣ Gợi ý nâng cao (không bắt buộc)

  • Có thể tối ưu bằng bảng băm (dict) để tra nhanh tổng a[j] + a[j-1]

  • Hoặc tiền xử lý các cặp tổng liên tiếp

ĐÁP ÁN CÂU 4: Đặt Lại Mật Khẩu

📌 Ví dụ trong đề

Input

2 4
abac
zbab

Một output hợp lệ

abab

✔ So với abac → khác 1 vị trí
✔ So với zbab → khác 1 vị trí


🎯 Ghi nhớ để đi thi

  • Đây là bài sinh – kiểm tra, không phải DP

  • Mẹo quan trọng: neo theo 1 xâu

  • Rất hay ra trong đề HSG / chuyên Tin

import sys
sys.stdin = open("PW.INP", "r")
sys.stdout = open("PW.OUT", "w")

# Đọc n và m
n, m = map(int, sys.stdin.readline().split())

# Đọc các xâu
S = [sys.stdin.readline().strip() for _ in range(n)]

# Xâu gốc
base = S[0]

# Hàm kiểm tra xâu P có hợp lệ không
def hop_le(P):
    for s in S:
        dem = 0
        for i in range(m):
            if s[i] != P[i]:
                dem += 1
                if dem > 1:
                    return False
    return True

# Thử xâu base trước
if hop_le(base):
    print(base)
    sys.exit()

# Thử thay đổi từng vị trí
for i in range(m):
    for c in range(ord('a'), ord('z') + 1):
        if chr(c) != base[i]:
            P = base[:i] + chr(c) + base[i+1:]
            if hop_le(P):
                print(P)
                sys.exit()

# Không có lời giải
print(-1)

🔍 Phân tích đề bài (hiểu cho đúng)

  • n xâu S1, S2, …, Sn

  • Mỗi xâu độ dài m (m ≤ 10)

  • Cần tìm xâu P độ dài m sao cho:

👉 Với mỗi xâu Si, số vị trí khác nhau giữa Si và P KHÔNG QUÁ 1
Tức là:

  • P giống hoàn toàn Si (0 vị trí khác) ✅

  • hoặc chỉ khác đúng 1 vị trí

  • nếu khác ≥ 2 vị trí ❌ (không hợp lệ)

📌 Nếu có nhiều xâu P thỏa → in bất kỳ
📌 Nếu không có → in -1


🧠 Ý tưởng giải (rất quan trọng)

Nhận xét mấu chốt

  • m rất nhỏ (≤ 10)

  • Ký tự chỉ từ 'a' đến 'z'

➡️ Ta thử sinh xâu P từ một xâu gốc (ví dụ S1) bằng cách:

  • Giữ nguyên S1

  • Hoặc đổi 1 vị trí của S1 sang chữ khác (a..z)

💡 Lý do:

  • Nếu tồn tại P hợp lệ, thì P phải giống ít nhất một xâu cho trước ở hầu hết vị trí

  • Thử từ S1 là đủ (kỹ thuật “neo” – rất hay ra thi)


🧪 Cách kiểm tra một xâu P có hợp lệ không

Với mỗi xâu Si:

  • Đếm số vị trí j sao cho Si[j] != P[j]

  • Nếu > 1 → P không hợp lệ

  • Nếu tất cả đều ≤ 1 → chấp nhận


🧩 Thuật toán

  1. Đọc n, m và danh sách xâu

  2. Lấy xâu gốc S0

  3. Tạo danh sách ứng viên P:

    • Chính S0

    • Với mỗi vị trí i:

      • Thử thay S0[i] bằng mọi chữ 'a'..'z'

  4. Với mỗi P:

    • Kiểm tra với tất cả Si

    • Nếu hợp lệ → in P và kết thúc

  5. Nếu hết mà không có → in -1


⏱ Độ phức tạp

  • Số ứng viên ≤ 1 + 26 * m ≈ 261

  • Mỗi ứng viên kiểm tra n * m

➡️ O(26 · m · n · m)
Với m ≤ 10 → chạy rất nhanh, an toàn thi tỉnh 👍

ĐÁP ÁN CÂU 5: Sự Lây Lan Covid-19

 

import sys

sys.stdin = open("COVID.INP", "r")
sys.stdout = open("COVID.OUT", "w")

# Doc du lieu
n = int(sys.stdin.readline().strip())
a = list(map(int, sys.stdin.readline().split()))

# Sap xep cac vi tri theo thu tu tang dan
a.sort()

# Tinh khoang cach giua cac vi tri va tim khoang cach nho nhat, lon nhat
min_dist = min(a[i + 1] - a[i] for i in range(n - 1))  # Khoang cach nho nhat giua hai nguoi
max_dist = a[-1] - a[0]  # Khoang cach xa nhat giua nguoi dau va nguoi cuoi

# So nhom nhiem benh toi thieu la 1, toi da la so nguoi vi tat ca deu cach xa nhau
print(min_dist // 2 + 1, max_dist // 2 + 1)

1️⃣ Ý tưởng thuật toán

Bài toán cho:

  • n: số người

  • Mảng a[]: vị trí của từng người trên một trục thẳng

Giả sử virus lây lan theo khoảng cách, mỗi người nhiễm có thể lây trong một phạm vi nhất định.
Ta cần xác định:

  • Số nhóm nhiễm tối thiểu

  • Số nhóm nhiễm tối đa

Dựa trên khoảng cách giữa các vị trí của những người.


2️⃣ Phân tích từng bước chương trình

🔹 Bước 1: Đọc dữ liệu

n = int(sys.stdin.readline().strip())
a = list(map(int, sys.stdin.readline().split()))
  • n: số người

  • a: danh sách vị trí của các người


🔹 Bước 2: Sắp xếp các vị trí

a.sort()
  • Đưa các vị trí về thứ tự tăng dần

  • Giúp việc tính khoảng cách giữa những người liền kề trở nên đơn giản


🔹 Bước 3: Tính khoảng cách nhỏ nhất và lớn nhất

min_dist = min(a[i + 1] - a[i] for i in range(n - 1))
  • Tính khoảng cách nhỏ nhất giữa hai người đứng gần nhau nhất

  • Đây là tình huống lây lan mạnh nhất → số nhóm ít nhất

max_dist = a[-1] - a[0]
  • Khoảng cách giữa người đứng đầu và người đứng cuối

  • Đây là tình huống lây lan yếu nhất → số nhóm nhiều nhất


🔹 Bước 4: Tính số nhóm nhiễm bệnh

print(min_dist // 2 + 1, max_dist // 2 + 1)

Giải thích công thức:

  • Mỗi nhóm lây lan chiếm bán kính 1 đơn vị về mỗi phía

  • Hai người cách nhau d sẽ tạo khoảng trống lây nhiễm là d // 2

  • Cộng thêm 1 là nhóm ban đầu

👉 In ra:

  • Số nhóm nhiễm tối thiểu

  • Số nhóm nhiễm tối đa


3️⃣ Độ phức tạp thuật toán

⏱️ Thời gian chạy

  • Sắp xếp mảng a:

O(nlog⁡n)O(n \log n)

  • Duyệt tính min_dist:

O(n)O(n)

👉 Tổng thời gian chạy:

O(nlog⁡n)\boxed{O(n \log n)}


💾 Bộ nhớ sử dụng

  • Lưu mảng a gồm n phần tử

  • Một vài biến đơn giản

👉 Độ phức tạp bộ nhớ:

O(n)\boxed{O(n)}


4️⃣ Nhận xét theo chuẩn bài thi

✔️ Ưu điểm:

  • Thuật toán đơn giản, hiệu quả

  • Không dùng vòng lặp lồng nhau

  • Chạy nhanh với n lớn

  • Rất phù hợp đề HSG THCS

✔️ Ý tưởng cốt lõi:

  • Chuyển bài toán lây lan → bài toán khoảng cách trên trục số

  • Chỉ cần xét khoảng cách nhỏ nhất và lớn nhất


5️⃣ Đánh giá tổng quát

Tiêu chíNhận xét
Độ đúng✅ Chính xác
Tốc độ⚡ Nhanh
Bộ nhớ💾 Thấp
Phù hợp thi🏆 Rất tốt

 

 

❓ CÂU HỎI THƯỜNG GẶP – 73 ĐỀ THI HSG TIN HỌC PYTHON THCS TIỀN GIANG


1. Bộ 73 đề thi HSG Tin học Python THCS cấp tỉnh Tiền Giang phù hợp cho lớp mấy?

Bộ 73 đề thi HSG Tin học Python THCS cấp tỉnh Tiền Giang phù hợp cho học sinh lớp 6, 7, 8 và 9, đặc biệt là học sinh đang ôn thi học sinh giỏi Tin học cấp huyện, cấp tỉnh và học sinh luyện thi vào lớp 10 chuyên Tin.


2. Các đề thi có đúng chuẩn cấu trúc đề thi tỉnh Tiền Giang không?

Có. Toàn bộ đề được chọn lọc và biên soạn dựa trên cấu trúc đề thi thực tế của Sở GD&ĐT Tiền Giang, đảm bảo sát đề thi thật, giúp học sinh không bị bỡ ngỡ khi đi thi.


3. Bộ đề có kèm đáp án và code Python chi tiết không?

Có đầy đủ. Mỗi đề đều có:

  • Đáp án chính xác

  • Code Python hoàn chỉnh

  • Giải thích tư duy thuật toán

  • Cách đọc – ghi file đúng chuẩn đề thi HSG Tin học THCS


4. Code Python trong bộ đề có phù hợp với bài thi chính thức không?

Hoàn toàn phù hợp. Code được viết theo chuẩn thi Tin học THCS, sử dụng:

  • import sys

  • Đọc dữ liệu từ file .INP

  • Ghi kết quả ra file .OUT
    Đúng với cách chấm bài trong các kỳ thi HSG cấp tỉnh.


5. Bộ đề này có phù hợp cho người mới học Python không?

Phù hợp nếu bạn đã nắm kiến thức Python cơ bản (biến, vòng lặp, điều kiện). Bộ đề được sắp xếp từ dễ → trung bình → nâng cao, giúp học sinh nâng trình từng bước, không bị quá tải.


6. Nội dung trong 73 đề thi gồm những dạng bài nào?

Bộ đề bao gồm:

  • Bài toán xử lý số, số nguyên tố

  • Mảng – danh sách – ma trận

  • Chuỗi ký tự

  • Bài toán tư duy thuật toán

  • Các dạng bài phân loại học sinh giỏi thường ra trong đề tỉnh


7. Giáo viên có thể dùng bộ đề này để bồi dưỡng học sinh không?

Rất phù hợp. Bộ đề là tài liệu chuẩn – đầy đủ – có lời giải chi tiết, giúp giáo viên:

  • Soạn bài bồi dưỡng HSG Tin học

  • Ra đề luyện tập

  • Hướng dẫn học sinh tư duy thuật toán đúng hướng

 

8. Luyện trọn bộ 73 đề này mang lại lợi ích gì?

Luyện đủ bộ đề giúp học sinh:

  • Nắm chắc dạng đề HSG Tin học Python THCS

  • Cải thiện tốc độ và độ chính xác khi làm bài

  • Hiểu rõ bản chất thuật toán

  • Tăng cơ hội đạt giải cấp huyện – cấp tỉnh


9. Bộ đề có cập nhật mới không?

Có. Bộ đề được chọn lọc và cập nhật, phù hợp với xu hướng ra đề mới, đúng yêu cầu Python trong chương trình THCS hiện nay.


10. Nên luyện bộ đề này như thế nào để đạt hiệu quả cao nhất?

Cách học hiệu quả nhất:
1️⃣ Làm đề không xem đáp án trước
2️⃣ Tự code và chạy thử
3️⃣ So sánh với code mẫu & cách tối ưu
4️⃣ Ghi chú lại dạng bài hay sai
5️⃣ Luyện lại sau 1–2 tuần

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

74 Đề thi học sinh giỏi Tin học THCS cấp Tỉnh Có ĐÁP ÁN 2026-2027

Tổng Hợp 74 Đề Thi Học Sinh Giỏi Tin Học THCS Cấp Tỉnh Có Đáp Án (Năm Học 2026-2027)

Kỳ thi chọn học sinh giỏi Tin học cấp THCS (đặc biệt là lớp 9) luôn là một thử thách lớn đòi hỏi sự chuẩn bị kỹ lưỡng về tư duy thuật toán và kỹ năng lập trình. Để đồng hành cùng các thầy cô giáo và các em học sinh, Vi Tính Tấn Dân xin chia sẻ bộ tài liệu “74 Đề thi học sinh giỏi Tin học THCS cấp tỉnh có đáp án” được cập nhật mới nhất cho năm học 2026-2027.

Đây là nguồn tài liệu quý giá giúp các em làm quen với cấu trúc đề thi, rèn luyện kỹ năng giải thuật trên các ngôn ngữ phổ biến như C++, Python và Pascal.

Các đề ôn thi để chuẩn bị thi Cấp Xã thì các em vào đường dẫn phía dưới để tham khảo giúp thầy nhé!

    1. Giải đề 1 và đáp án thi Học sinh giỏi tin học Python C++ THCS có tài liệu ôn thi
    2. Giải đề 2 và đáp án thi Học sinh giỏi tin học Python C++ THCS có tài liệu ôn thi
    3. Giải đề 3 thi học sinh giỏi tin học lập trình Python có đáp án
    4. Giải đề 4 ôn thi học sinh giỏi Tin Học THCS lập trình Python có đáp án
    5. Giải đề 5 và đáp án thi HSG Tin Python có số Pell.
    6. Giải đề 6 và đáp án bồi dưỡng học sinh giỏi tin 10 có số Armstrong
    7. Giải đề 7 và đáp án  thi học sinh giỏi tin học 10 Python có số Collatz
    8. Giải đề 8 trong 20 đề Bồi dưỡng học sinh giỏi Tin học lớp 9 có số Kaprekar.
    9. Giải đề 9 thi HSG Tin học lớp 8 lập trình Python có số Happy
    10. Giải đề 10 thi tin học trẻ THPT có bài  In các xâu con trong xâu s.
    11. Đề thi hsg tin 11 python có đáp án hay nhất 2024
    12. 12 đề và đáp án thi HSG tin Python có sắp xếp
    13. Đề 13 thi học sinh giỏi Tin học THCS có đáp án hay nhất năm 2024.
    14. 14 đề bồi dưỡng học sinh giỏi tin học lớp 7, 8, 9 THCS mới nhất !
    15. 15 Đề thi học sinh giỏi Tin học lớp 9 cấp huyện hay nhất 2024 – 2025
    16. 16 Đề bài tập Python có lời giải PDF thi HSG cấp huyện mới nhất
    17. 17 đề thi tin học trẻ có Đáp Án python THCS cấp huyện PDF
    18. 18 Đề thi học sinh giỏi Tin học THCS có đáp ÁN dễ học nhất năm 2025
    19. 19 thi HSG Tin 9 C ++ hoặc Python có đáp án
    20. 100 đề và đáp án thi HSG tin Python cấp huyện 2025

1. Tại sao bạn nên tải bộ 74 đề thi HSG Tin học này?

Khác với các tài liệu trôi nổi trên mạng, bộ sưu tập 74 đề thi này được Vi Tính Tấn Dân tổng hợp và chọn lọc kỹ càng từ các kỳ thi chính thức của nhiều tỉnh thành trên cả nước trong những năm gần đây.

  • Số lượng lớn: Với 74 đề thi, học sinh có thể thoả sức luyện tập từ cơ bản đến nâng cao.

  • Có đáp án chi tiết: Tất cả các đề đều đi kèm Test case (Input/Output) chuẩn và Code mẫu (Solution) giúp học sinh dễ dàng đối chiếu kết quả.

  • Cập nhật xu hướng mới: Đề thi bám sát cấu trúc ra đề của Bộ GD&ĐT và các Sở GD&ĐT trong giai đoạn 2025-2027, tập trung mạnh vào tư duy thuật toán thay vì chỉ cú pháp ngôn ngữ.

2. Cấu trúc đề thi học sinh giỏi Tin học THCS năm 2026-2027 có gì mới?

Theo xu hướng chuyển đổi số và đổi mới giáo dục, đề thi HSG Tin học cấp tỉnh hiện nay thường có cấu trúc như sau:

  • Thời gian làm bài: 150 phút.

  • Hình thức: Thi lập trình trên máy tính (chấm tự động bằng các phần mềm như Themis, CMS…).

  • Ngôn ngữ lập trình: Cho phép sử dụng C++ (phổ biến nhất), Python (xu hướng mới) và Free Pascal.

Các dạng bài tập thường gặp:

  1. Bài toán số học: Tìm số nguyên tố, ước số, số hoàn hảo, xử lý số lớn…

  2. Xử lý mảng và chuỗi: Sắp xếp, tìm kiếm, thao tác trên xâu ký tự.

  3. Thuật toán & Quy hoạch động: Các bài toán tối ưu, bài toán cái túi, dãy con tăng dài nhất…

  4. Hình học & Tổ hợp: Tính diện tích, đếm số phương án…

3. Review nội dung bộ đề thi

Dưới đây là tóm tắt nội dung của một số đề thi tiêu biểu có trong bộ tài liệu này:

Đề số 01: Đề thi HSG Tin học Tỉnh Tiền Giang (Năm 2021- 2022)

  • Bài 1 (4 điểm): Tìm số nguyên tố đầy đủ?

  • Bài 2 (4 điểm): Tìm Mật Mã (Mảng 1 chiều + Thuật toán đếm)?

  • Bài 3 (4 điểm): Bài toán Ma Trận?

  • Bài 4 (4 điểm): Về hình học Tính Tam Giác?

  • Bài 5 (4 điểm): Tính Lãi Kép Ngân Hàng?

(Tất cả đều có code giải tham khảo bằng C++ và Python)

4. Hướng dẫn ôn thi hiệu quả với bộ tài liệu này

Để đạt kết quả cao nhất trong kỳ thi cấp tỉnh, các em học sinh nên tuân thủ lộ trình sau:

  1. Giai đoạn 1: Tải bộ đề về và phân loại theo độ khó.

  2. Giai đoạn 2: Tự bấm giờ làm bài giống như thi thật (không xem đáp án trước).

  3. Giai đoạn 3: So sánh kết quả với bộ Test case.

  4. Giai đoạn 4: Tham khảo Code mẫu để học hỏi cách viết code tối ưu, ngắn gọn và “sạch” hơn.

5. Tải xuống 74 Đề thi học sinh giỏi Tin học THCS cấp tỉnh (Full Code)

Các thầy cô và các em học sinh có thể tải trọn bộ tài liệu tại liên kết bên dưới. File nén bao gồm: File đề bài (PDF/Word), Bộ Test (Input/Output), và Code giải (CPP/PY/PAS).

Tải đề Thi Đề thi HSG Tin học THCS Python Cấp Tỉnh file PDF:

Tải bằng google driver


Lời kết

Hy vọng bộ tài liệu 74 đề thi học sinh giỏi Tin học THCS cấp tỉnh có đáp án 2026-2027 này sẽ là hành trang vững chắc giúp các em học sinh tự tin bước vào phòng thi và gặt hái giải cao.

Đừng quên ghé thăm Vi Tính Tấn Dân thường xuyên để cập nhật thêm nhiều tài liệu công nghệ, thủ thuật máy tính và đề thi mới nhất nhé!

Đáp Án Bài 1: Số Nguyên Tố Đầy Đủ

import sys
import math

# MỞ FILE VÀO / RA (đúng chuẩn thi)
sys.stdin = open("FULLPRIM.INP", "r")
sys.stdout = open("FULLPRIM.OUT", "w")


# Hàm kiểm tra số nguyên tố
def la_so_nguyen_to(so):
    if so < 2:
        return False
    if so == 2:
        return True
    if so % 2 == 0:
        return False

    can_bac_hai = int(math.sqrt(so))
    for uoc in range(3, can_bac_hai + 1, 2):
        if so % uoc == 0:
            return False
    return True


# ===== CHƯƠNG TRÌNH CHÍNH =====

# Nhập số lượng phần tử
so_luong = int(input())

# Nhập dãy số
day_so = list(map(int, input().split()))

ket_qua = []

# Duyệt từng số trong dãy
for so in day_so:
    if la_so_nguyen_to(so):
        so_dao = int(str(so)[::-1])
        if la_so_nguyen_to(so_dao):
            ket_qua.append(str(so))

# Xuất kết quả
if len(ket_qua) == 0:
    print(0)
else:
    print(" ".join(ket_qua))

🧠 Giải thích ngắn gọn cách làm

  1. Viết hàm la_so_nguyen_to() để kiểm tra số nguyên tố

  2. Với mỗi số trong dãy:

    • Kiểm tra số đó có nguyên tố không

    • Đảo ngược số

    • Kiểm tra số đảo có nguyên tố không

  3. Nếu cả hai đều nguyên tố → là số nguyên tố đẩy đủ

  4. In ra danh sách kết quả, nếu không có in 0


⏱️ Độ phức tạp

  • Kiểm tra 1 số nguyên tố: O(√n)

  • Tổng:

O(N × √max)
  • Bộ nhớ: O(1)

 

Đáp Án Bài 2: Mật Mã:

 

 

# SECRCODE.py
import sys
sys.stdin = open("SECRCODE.INP", "r")
sys.stdout = open("SECRCODE.OUT", "w")

xau = sys.stdin.read().strip()

# Mảng đếm số lần xuất hiện của các chữ cái a -> z
dem = [0] * 26

# Đếm ký tự
for ky_tu in xau:
    vi_tri = ord(ky_tu) - ord('a')
    dem[vi_tri] += 1
# Tạo mã bản quyền
ket_qua = ""
for i in range(26):
    if dem[i] > 0:
        ket_qua += str(dem[i])
print(ket_qua)

🔹 Phân tích bài toán

  • Đề bài cho một xâu ký tự thường a–z

  • Cần:

    1. Đếm số lần xuất hiện của từng chữ cái

    2. Theo thứ tự alphabet a → z

    3. Nếu chữ cái xuất hiện (đếm > 0) thì ghi số lần xuất hiện vào mã

  • Các số được nối liền nhau, không có dấu cách


🔹 Ví dụ phân tích

Xâu:

bcddaagfxybbbccccdeeezyyzzz
Ký tựSố lần
a2
b4
c6
d3
e5
f1
x3
y3
z4

👉 Mã bản quyền: 246351334


🔹 Ý tưởng giải

  • Dùng mảng đếm 26 phần tử, mỗi phần tử tương ứng một chữ cái

  • Duyệt xâu:

    • Mỗi ký tự → tăng biến đếm tương ứng

  • Duyệt mảng từ a đến z:

    • Nếu số đếm > 0 → nối vào kết quả


🔹 Độ phức tạp

  • Thời gian: O(n) (n là độ dài xâu)

  • Bộ nhớ: O(1) (chỉ dùng mảng 26 phần tử)

 

Đáp án bài 3: Chọn Phần Thưởng

 

# BONUSSEL.py
import sys
import math

sys.stdin = open("BONUSSEL.INP", "r")
sys.stdout = open("BONUSSEL.OUT", "w")

m, n = map(int, sys.stdin.readline().split())

tong = 0

for _ in range(m):
    dong = list(map(int, sys.stdin.readline().split()))
    for gia_tri in dong:
        can = int(math.isqrt(gia_tri))
        if can * can == gia_tri:
            tong += gia_tri

print(tong)

🔹 Phân tích bài toán

  • Cho bảng số nguyên dương kích thước m × n

  • Yêu cầu:

    • Tìm tất cả các số chính phương

    • Tính tổng các số đó


🔹 Số chính phương là gì?

Một số x là số chính phương nếu:

x = k² (k là số tự nhiên)

👉 Cách kiểm tra nhanh:

k = int(sqrt(x))
nếu k * k == xx là số chính phương

🔹 Ý tưởng giải

  • Đọc m, n

  • Duyệt từng phần tử trong bảng

  • Với mỗi số:

    • Tính căn bậc hai nguyên

    • Nếu bình phương lại bằng chính nó → cộng vào tổng


🔹 Độ phức tạp

  • Thời gian: O(m × n)

  • Bộ nhớ: O(1)

✅ Ghi nhớ khi đi thi

✔ Dùng math.isqrt() chính xác – nhanh – an toàn
✔ Biến đặt rõ nghĩa
✔ Không in thừa dòng, thừa khoảng trắng

Đáp án bài 4: Tam Giác

# TRIANGLE.py
import sys
sys.stdin = open("TRIANGLE.INP", "r")
sys.stdout = open("TRIANGLE.OUT", "w")

def binh_phuong_khoang_cach(x1, y1, x2, y2):
    return (x2 - x1) ** 2 + (y2 - y1) ** 2

T = int(sys.stdin.readline())

for _ in range(T):
    xa, ya, xb, yb, xc, yc = map(float, sys.stdin.readline().split())

    # Kiểm tra 3 điểm có thẳng hàng không
    dien_tich = (xb - xa) * (yc - ya) - (xc - xa) * (yb - ya)
    if dien_tich == 0:
        print("NO")
        continue

    # Tính bình phương độ dài các cạnh
    AB2 = binh_phuong_khoang_cach(xa, ya, xb, yb)
    BC2 = binh_phuong_khoang_cach(xb, yb, xc, yc)
    CA2 = binh_phuong_khoang_cach(xc, yc, xa, ya)

    # Kiểm tra định lý Pitago
    if (abs(AB2 + BC2 - CA2) < 1e-9 or
        abs(AB2 + CA2 - BC2) < 1e-9 or
        abs(BC2 + CA2 - AB2) < 1e-9):
        print("YES")
    else:
        print("NO")

🔹 Phân tích đề bài

Cho T bộ dữ liệu, mỗi bộ gồm tọa độ 3 điểm A, B, C trong mặt phẳng OXY.

Yêu cầu:
👉 Kiểm tra 3 điểm có tạo thành TAM GIÁC VUÔNG hay không

In:

  • "YES" nếu là tam giác vuông

  • "NO" nếu không phải


🔹 Điều kiện toán học

1️⃣ Ba điểm tạo thành tam giác

Ba điểm không thẳng hàng
Diện tích tam giác ≠ 0

👉 Kiểm tra bằng tích có hướng:

(xB - xA)(yC - yA) - (xC - xA)(yB - yA) ≠ 0

2️⃣ Tam giác vuông (định lý Pitago)

  • Gọi:
  • AB², BC², CA² là bình phương độ dài các cạnh

  • Tam giác vuông nếu:
  • AB² + AC² = BC²
    hoặc
    AB² + BC² = AC²
    hoặc
    AC² + BC² = AB²
  • ⚠️ KHÔNG lấy căn để tránh sai số số thực (đề đã nhắc)

🔹 Công thức bình phương khoảng cách

Với A(x₁, y₁), B(x₂, y₂):

AB² = (x₂ - x₁)² + (y₂ - y₁)²

🔹 Ý tưởng giải

Với mỗi bộ test:

  1. Đọc tọa độ A, B, C

  2. Kiểm tra có tạo thành tam giác

  3. Tính AB², BC², CA²

  4. Kiểm tra định lý Pitago

  5. In kết quả


🔹 Độ phức tạp

  • Mỗi test: O(1)

  • Tổng: O(T)
    → Chạy rất nhanh

 

✅ Giải thích điểm quan trọng (rất hay bị sai)

  • ⚠️ KHÔNG dùng sqrt()
    ⚠️ So sánh số thực phải dùng sai số nhỏ (1e-9)
    ⚠️ Phải kiểm tra tạo thành tam giác trước

📌 Mẹo ăn điểm khi thi

  • ✔ Dùng bình phương độ dài
    ✔ So sánh bằng abs(a-b) < 1e-9
    ✔ In đúng "YES" / "NO" (IN HOA)

1. Bản chất của đoạn code

Đoạn code này dùng để kiểm tra xem một tam giác có phải là tam giác vuông hay không dựa trên Định lý Pitago đảo.

  • Định lý: Nếu tổng bình phương hai cạnh bằng bình phương cạnh còn lại ($a^2 + b^2 = c^2$) thì đó là tam giác vuông.

  • Vì chúng ta không biết cạnh nào là cạnh huyền, nên phải kiểm tra cả 3 trường hợp:

    1. AB^2 + BC^2 = CA^2 (Vuông tại B)

    2. AB^2 + CA^2 = BC^2 (Vuông tại A)

    3. BC^2 + CA^2 = AB^2 (Vuông tại C)


2. Tại sao phải dùng abs(...) < 1e-9 mà không dùng dấu ==?

Đây là kiến thức “sống còn” cho học sinh khi thi HSG Tin học.

  • Vấn đề sai số: Trong máy tính, các số thực (kiểu float) được lưu dưới dạng nhị phân nên thường xảy ra sai số nhỏ.

    • Ví dụ: Kết quả lẽ ra là 25.0 nhưng máy tính có thể lưu là 24.99999999999999.

    • Nếu ta dùng if AB2 + BC2 == CA2:, máy sẽ trả về False (Sai), dẫn đến mất điểm oan.

  • Giải pháp: Thay vì so sánh bằng nhau tuyệt đối, ta kiểm tra xem hiệu của hai vế có đủ nhỏ hay không.

    • abs(AB2 + BC2 - CA2) là trị tuyệt đối của hiệu hai vế.

    • 1e-9 (tức là 10^{-9} hay 0.000000001) được gọi là sai số cho phép (epsilon).

Kết luận: Nếu hiệu của hai vế nhỏ hơn 10^{-9}, ta coi như chúng bằng nhau.


3. Cách giải thích cho học sinh (Ngôn ngữ của Thầy Dân)

Thầy có thể dạy các em như thế này:

  1. Bước 1: Tính bình phương độ dài 3 cạnh (gọi là AB2, BC2, CA2).

  2. Bước 2: Áp dụng Pitago đảo. Nhưng nhớ là trong lập trình, “bằng nhau” với số thực rất mong manh.

  3. Bước 3: Sử dụng “khoảng cách an toàn”. Nếu hai vế chỉ lệch nhau một tí xíu không đáng kể (< 1e-9) thì máy tính chấp nhận đó là tam giác vuông.


4. Code viết lại cho chuyên nghiệp

Các em có thể đưa đoạn này vào chuyên đề Hình học:

# Giả sử đã tính xong bình phương các cạnh AB2, BC2, CA2
sai_so = 1e-9 # Epsilon

# Kiểm tra từng trường hợp vuông tại A, B, hoặc C
vuong_tai_B = abs(AB2 + BC2 - CA2) < sai_so
vuong_tai_A = abs(AB2 + CA2 - BC2) < sai_so
vuong_tai_C = abs(BC2 + CA2 - AB2) < sai_so

if vuong_tai_A or vuong_tai_B or vuong_tai_C:
    print("YES") # Là tam giác vuông
else:
    print("NO")

Đáp án bài 5: Lãi Kép Ngân Hàng:

# COMPINT.py
import sys
sys.stdin = open("COMPINT.INP", "r")
sys.stdout = open("COMPINT.OUT", "w")

T = int(sys.stdin.readline())

for _ in range(T):
    M, r, n = map(float, sys.stdin.readline().split())
    n = int(n)

    tong_tien = M

    # Tính lãi kép qua từng tháng
    for _ in range(n):
        tong_tien = tong_tien + tong_tien * r / 100

    # In kết quả với 1 chữ số thập phân
    print(f"{tong_tien:.1f}")

🔹 Phân tích đề bài

  • T khoản gửi tiết kiệm

  • Mỗi khoản gồm:

    • M: tiền vốn ban đầu

    • r: lãi suất % mỗi tháng

    • n: số tháng gửi

  • Hình thức: LÃI KÉP

    • Tiền lãi của tháng trước được cộng vào vốn để tính lãi cho tháng sau

👉 Yêu cầu:
Tính tổng số tiền nhận được sau n tháng, in ra 1 chữ số thập phân


🔹 Công thức lãi kép theo tháng

Sau mỗi tháng:

T = T + T * r / 100

Tương đương:

T = T * (1 + r/100)

Lặp lại n lần


🔹 Ví dụ phân tích (đề bài)

Gửi:

M = 1 000 000
r = 0.7 (%)
n = 3
  • Tháng 1:
    T1 = 1000000 * 1.007 = 1007000

  • Tháng 2:
    T2 = 1007000 * 1.007 = 1014049

  • Tháng 3:
    T3 = 1014049 * 1.007 = 1021147.3


🔹 Ý tưởng giải

  • Đọc số bộ test T

  • Với mỗi bộ:

    • Gán tong_tien = M

    • Lặp n tháng:

      • tong_tien *= (1 + r/100)

  • In kết quả định dạng 1 chữ số thập phân


🔹 Độ phức tạp

  • Mỗi test: O(n) (n ≤ 500)

  • Tổng: O(T × n) → chạy rất nhanh


⚠️ Lưu ý quan trọng khi thi

Dùng số thực (float)
Không làm tròn sớm
✔ Chỉ làm tròn khi in kết quả
✔ In đúng 1 chữ số thập phân

🧠 Vì sao KHÔNG dùng công thức mũ?

Có thể dùng:

T = M * (1 + r/100)^n

❌ Nhưng dễ sai số số thực
✅ Vòng lặp an toàn hơn – đúng tinh thần đề THCS


📌 Tóm tắt nhanh

Nội dungGhi nhớ
Loại lãiLãi kép
Công thứcNhân dồn từng tháng
Output1 chữ số thập phân
Sai lầm hay gặpLàm tròn sớm

 

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

2 Khóa Học Tin Học Online Thầy Dân Luyện Thi Chuyên Tin Tin Văn Phòng Cấp Tốc

Tổng hợp 75 Đề thi HSG Tin học THCS Python Cấp Tỉnh (Có Code Giải Chi Tiết)

Tổng hợp 75 Đề thi HSG Tin học THCS Python Cấp Tỉnh (Có Code Giải Chi Tiết – Độ phức tạp) cập nhật mới nhất năm 2026 – 2027

Tải đề Thi Đề thi HSG Tin học THCS Python Cấp Tỉnh file PDF:

Tải bằng google driver

Các đề ôn thi để chuẩn bị thi Cấp Xã thì các em vào đường dẫn phía dưới để tham khảo giúp thầy nhé!

    1. Giải đề 1 và đáp án thi Học sinh giỏi tin học Python C++ THCS có tài liệu ôn thi
    2. Giải đề 2 và đáp án thi Học sinh giỏi tin học Python C++ THCS có tài liệu ôn thi
    3. Giải đề 3 thi học sinh giỏi tin học lập trình Python có đáp án
    4. Giải đề 4 ôn thi học sinh giỏi Tin Học THCS lập trình Python có đáp án
    5. Giải đề 5 và đáp án thi HSG Tin Python có số Pell.
    6. Giải đề 6 và đáp án bồi dưỡng học sinh giỏi tin 10 có số Armstrong
    7. Giải đề 7 và đáp án  thi học sinh giỏi tin học 10 Python có số Collatz
    8. Giải đề 8 trong 20 đề Bồi dưỡng học sinh giỏi Tin học lớp 9 có số Kaprekar.
    9. Giải đề 9 thi HSG Tin học lớp 8 lập trình Python có số Happy
    10. Giải đề 10 thi tin học trẻ THPT có bài  In các xâu con trong xâu s.
    11. Đề thi hsg tin 11 python có đáp án hay nhất 2024
    12. 12 đề và đáp án thi HSG tin Python có sắp xếp
    13. Đề 13 thi học sinh giỏi Tin học THCS có đáp án hay nhất năm 2024.
    14. 14 đề bồi dưỡng học sinh giỏi tin học lớp 7, 8, 9 THCS mới nhất !
    15. 15 Đề thi học sinh giỏi Tin học lớp 9 cấp huyện hay nhất 2024 – 2025
    16. 16 Đề bài tập Python có lời giải PDF thi HSG cấp huyện mới nhất
    17. 17 đề thi tin học trẻ có Đáp Án python THCS cấp huyện PDF
    18. 18 Đề thi học sinh giỏi Tin học THCS có đáp ÁN dễ học nhất năm 2025
    19. 19 thi HSG Tin 9 C ++ hoặc Python có đáp án
    20. 100 đề và đáp án thi HSG tin Python cấp huyện 2025

Thiết kế dạng hình:

75 Đề thi HSG Tin học THCS Python cấp Tỉnh có Đáp Án 2026-2027

Xoá term: 100 đề và đáp an thi HSG Tin Python 100 đề và đáp an thi HSG Tin Python De thi học sinh giỏi Tin học THCS có đáp AN Tài liệu bồi dưỡng HSG Tin học THCS Python

Thiết kế dạng chữ :

KỲ THI CHỌN HỌC SINH GIỎI CẤP TỈNH
TRUnG học Cơ Sở

Năm học 2022-2023 Môn: TIN HỌC

Thời gian: 150 phút (không kể thời gian giao đề) Ngày thi: 21/3/2023 ^

(Đề thi có 5 trang, gồm 5 bài)

TỔNG quan các BÀi thi

Thứ tự 

Tên bài

File chương trìnhFile dữ liệu vàoFile kết quả
Bài 1Tương đồngSAME.*SAME.INPSAME.OUT
Bài 2Tách xâuSTRING.*STRING.INPSTRING.OUT
Bài 3May mắnLUCKY.*LUCKY.INPLUCKY.OUT
Bài 4Tam giácTRIANGLE.*TRIANGLE.INPTRIANGLE.OUT
Bài 5Chở hàngGOOD.*GOOD.INPGOOD.OUT
Dấu * được thay thế bởi PAS, CPP, PY của ngôn ngữ lập trình được sử dụng tương ứng là Free Pascal, C++, Python hoặc phần mở rộng tương ứng với NNLT khác.

 

 

Bài 1: (4 điểm) Tương đồng   Tên chương trình: SAME.*

Vườn bưởi nhà Alice có n cây. Để theo dõi sự phát triển của các cây bưởi của mình, Alice thường xuyên đo và ghi lại chiều cao của chúng. Trong tuần này, Alice có được bảng chiều cao của các cây bưởi là một dãy số nguyên a[1], a[2],…, a[n], trong đó a[i] là chiều cao của cây bưởi thứ i. Nhìn vào dãy số, Alice biết có những cây có chiều cao trùng nhau và Alice gọi mỗi tần số trùng nhau là tần số “tương đồng”.

Do số lượng cây bưởi nhiều nên Alice muốn nhờ các bạn lập trình tìm tần số tương đồng lớn nhất của các cây bưởi là bao nhiêu?

Dữ liệu vào: Đọc từ file SAME. INP gồm 2 dòng:

  • Dòng 1: gồm một số nguyên dương n (0 < n <106).
  • Dòng 2: gồm n số nguyên dương a[i] (0 < ai <106), mỗi số ứng với chiều cao của một cây bưởi, giữa các số được cách nhau bởi một khoảng trắng.

Kết quả: Ghi ra file SAME.OUT gồm duy nhất một số nguyên dương là tần số tương đồng lớn nhất.

Ví dụ:

SAME.INPsame.out
7

9 8 6 8 5 6 10

2
2

3 10

1

 

 

Giải thích bộ test 1:

Có 1 chiều cao: 5;

Có 2 chiều cao: 6;

Có 2 chiều cao: 8;

Có 1 chiều cao: 9;

Có 1 chiều cao: 10

->Tần số tương đồng lớn nhất là: 2

Bài 2: (4 điểm) Tách xâu Tên chương trình: STRING.*

Hôm nay, mẹ và Cám đi dự dạ hội. Tấm cũng rất muốn được đi. Nhưng trước khi đi, mẹ Cám giao cho Tấm một công việc để làm khó Tấm như sau:

Cho một xâu s gồm các ký tự là các chữ cái in hoa hoặc in thường (trong bảng chữ cái Tiếng Anh) và các kí tự số. Mẹ kế yêu cầu Tấm hãy tách các ký tự trong xâu s thành hai phần như sau:

Phần 1: gồm các chữ cái có mặt trong s nhưng viết theo thứ tự ngược lại.

Phần 2: gồm các chữ số có mặt trong xâu s nhưng phải được sắp xếp theo thứ tự từ nhỏ đến lớn.

Nếu Tấm thực hiện xong công việc thì mới được đi dự tiệc. Nhưng Tấm có thời gian rất ít nên chưa giải được bài toán. Các bạn đội tuyển Tin học hãy giúp đỡ Tấm giải bài toán để Tấm còn được đi dự tiệc nhé!

Dữ liệu vào: Đọc từ file STRING.INP gồm 1 dòng chứa xâu s có độ dài không quá 103 ký tự. Dữ liệu vào đảm trong xâu s luôn có kí tự chữ cái và kí tự chữ số. Kết quả: Ghi ra fíle STRING.OUT gồm 2 dòng:

  • Dòng 1: gồm các chữ cái trong xâu s nhưng được viết theo thứ tự ngược lại.
  • Dòng 2: gồm các chữ số trong xâu s, nhưng phải được sắp xếp theo thứ tự từ nhỏ đến lớn.

Ví dụ:

STRING.INPSTRING.OUT
m2aC0ma2T3TamCam

0223

 

 

Bài 3: (4 điểm) May mắn Tên chương trình: LUCKY.*

Trong buổi tiệc liên hoan cuối năm của công ty cung cấp điện thoại Thế Giới Trẻ, ghế ngồi trong hội trường của khách mời được bố trí thành một ma trận hình chữ nhật gồm m hàng và n cột. Để buổi liên hoan thêm vui vẻ, ban tổ chức cho mỗi khách mời rút ngẫu nhiên một phiếu, trên phiếu có ghi một số nguyên dương trong phạm vi từ 1 đến 109.

Ban tổ chức sẽ trao cho những người may mắn mỗi người một phần quà là một chiếc điện thoại. Biết rằng người may mắn là người có số ghi trong phiếu của

mình lớn hơn trung bình cộng của số trong phiếu của những người ngồi xung quanh người đó.

Xung quanh một người được định nghĩa như sau:

Trường hợp 1: Người ngồi ở vị trí góc (trên trái, dưới trái, trên phải, dưới

phải) của hình chữ nhật thì chỉ có 2 người ngồi xung quanh.

Trường hợp 2: Người ngồi ở vị trí bìa (trừ góc) thì có 3 người xung quanh. Trường hợp 3: Người ngồi ở các vị trí còn lại có 4 người xung quanh.

 

 

Trường hợp 1                                                  Trường hợp 2                                                  Trường hợp 3

Ô gạch sọc chỉ vị trí xung quanh của vị trí được tô đen.

Bạn hãy giúp ban tổ chức xác định số lượng điện thoại cần phải chuẩn bị để trao cho những người may mắn.

Dữ liệu vào: Đọc từ file LUCKY.INP gồm:

  • Dòng 1: gồm hai số nguyên dương theo thứ tự m, n (0 < m, n <103), giữa m và n được cách nhau bởi dấu cách.
  • m dòng tiếp theo, mỗi dòng gồm n số nguyên dương có giá trị không quá 109, giữa hai số cách nhau bởi một dấu cách.

Kết quả: Ghi ra file LUCKY.OUT gồm một số nguyên là số điện thoại ban tổ chức cần chuẩn bị.

Ví dụ:

LUCKY.INPLUCKY.OUT
3 43
1 4 3 1
1 1 5 2
2 1 2 1

 

 

Giải thích:

Số lượng điện thoại cần chuẩn bị là 3, vì có ba người may mắn:

+ Người thứ nhất ngồi ở hàng 1, cột 2, có số phiếu là 4 (có 3 người xung quanh) + Người thứ hai ngồi ở hàng 2, cột 3, có số phiếu là 5 (có 4 người xung quanh) + Người thứ ba ngồi ở hàng 3, cột 1, có số phiếu là 2 (có 2 người xung quanh)

Bài 4: (4 điểm) Tam giác Tên chương trình: TRIANGLE.*

Alice có n que tính, mỗi que có độ dài là một số nguyên dương. Alice muốn tạo ra các tam giác bằng cách ghép ba que tính lại với nhau, độ dài mỗi cạnh là một que tính.

Em hãy giúp Alice đếm xem có bao nhiêu tam giác được tạo thành từ các que tính này và cho biết diện tích lớn nhất trong các diện tích của các tam giác ghép được là bao nhiêu?

Biết rằng:

+ Hai tam giác được gọi là khác nhau nếu có ít nhất một que tính khác nhau.

+ Ta có thể tính diện tích tam giác theo công thức sau :

s=Vp * (p — à) * (p — b) * (p — c)

Trong đó a,b,c là độ dài 3 cạnh của tam giác, và p là nửa chu vi của tam giác.

Dữ liệu vào: Đọc từ file TRIANGLE.INP gồm:

  • Dòng 1: gồm một số nguyên dương n (3 < n < 100)
  • Dòng 2: gồm n số nguyên dương a[1], a[2], …, a[n] là độ dài của n que tính (1 < a[i] < 106 1<i<n). Giữa các số được cách nhau bởi một khoảng trắng.

Kết quả: Ghi ra file TRIANGLE.OUT gồm:

  • Dòng 1: Ghi số lượng tam giác có thể ghép được.
  • Dòng 2: Ghi một số thực là diện tích lớn nhất của tam giác, kết quả làm tròn đến 2 chữ số ở phần thập phân. Trường hợp không có tam giác nào thì dòng này ghi -1.
TRIANGLE.INPTRIANGLE.OUTGiải thích
53Có 3 tam giác được tạo từ 5 que tính trên:
1 4 5 2 36.00Tam giác 1: Que thứ 2, 3, 4 Tam giác 2: Que thứ 2, 3, 5 Tam giác 3: Que thứ 2, 4, 5 Trong đó tam giác thứ 2 có 3 độ dài là 4 5 3 có có diện tích lớn nhất là 6.00
44Có 4 tam giác được tạo từ 4 que tính trên:
2 2 2 21.73Tam giác 1: Que thứ 1, 2, 3

Tam giác 2: Que thứ 1, 2, 4

Tam giác 3: Que thứ 1, 3, 4

Tam giác 4: Que thứ 2, 3, 4

Trong đó 4 tam giác đều có cùng diện

tích là: 1.73

30Không ghép được tam giác nào
1 2 3-1

 

 

Bài 5: (4 điểm) Hàng hóa Tên chương trình: GOOD.*

Cửa hàng tạp hóa XYZ cần chở n kiện hàng giao cho khách. Kiện hàng thứ i có trọng lượng là a[i] tấn. Cửa hàng có một xe tải có trọng tải là m tấn. Trong

chuyến hàng đầu tiên, cửa hàng muốn chở những kiện hàng đi giao thỏa mãn các yêu cầu sau:

  • Yêu cầu 1: Ưu tiên kiện hàng có trọng lượng lớn hơn sẽ được chở đi.
  • Yêu cầu 2: Xe còn đủ trọng tải chở được thì chọn tiếp kiện hàng khác thỏa mãn yêu cầu 1.

Em hãy lập trình giúp cửa hàng xác định trọng lượng các kiện hàng của chuyến xe đầu tiên.

Dữ liệu vào: Đọc từ file GOOD.INP gồm hai dòng:

  • Dòng 1: gồm số nguyên dương n (1 <n<103) là số kiện hàng và số nguyên dương m (0 < m < 109) là trọng lượng của xe tải. Giữa n và m được cách nhau bởi dấu cách.
  • Dòng 2: gồm n số nguyên dương a[i] (0 < a[i] <109, a[i] < m, 1<i<n) thể hiện trọng lượng của kiện hàng thứ i. Giữa các số được cách nhau bởi dấu cách.

Kết quả: Ghi ra file GOOD.OUT các số nguyên dương là trọng lượng của các kiện hàng trong chuyến xe đầu tiên theo trọng lượng giảm dần.

GOOD.INPGOOD.OUT
5 10

7 5 1 3 8

8 1
5 12

2 8 2 4 1

8 4

 

 

Giải thích bộ test 1:

Có n = 5 kiện hàng và xe có trọng tải m = 10 tấn Các kiện hàng có trọng lượng lần lượt là: 7 5 1 3 8 Vậy các kiện hàng được chở đi trong chuyến đầu tiên có trọng lượng lần lượt là 8 và 1.

Vì kiện hàng có trọng lượng là 8 lớn hơn trọng lượng các kiện hàng còn lại và 8 < m=10 nên được ưu tiên chọn. Trọng tải xe còn có thể chứa được là 10 – 8 = 2, nên chọn tiếp kiện hàng có trọng lượng là 1.

…………………………………………………… HẾT…………………………………………………….

Thí sinh không được sử dụng tài liệu. Giám thị không giải thích gì thêm.

Họ và tên thí sinh: …………………………………………………………. Số báo danh:……………………………………………………………..

 

 

Đáp án bài 1: Tương đồng – SAME.*

1.1 Đáp án bài 1:

import sys
from collections import Counter
sys.stdin = open("SAME.INP", "r")
sys.stdout = open("SAME.OUT", "w")
n = int(sys.stdin.readline().strip())  # Đọc số lượng phần tử (không cần dùng)
a = list(map(int, sys.stdin.readline().split()))  # Đọc danh sách số
tanso = Counter(a)  # Đếm tần số xuất hiện của từng số
tansolonnhat = max(tanso.values())  # Tìm tần số lớn nhất
print(tansolonnhat)  # Ghi kết quả ra file

1.2 CÁCH GIẢI 1:

1️⃣  Đọc dữ liệu từ file:

  • Vì bạn muốn dùng sys.stdin, ta mở file bằng sys.stdin = open(“SAME.INP”, “r”).
  • Đọc số n (số lượng phần tử) nhưng không cần dùng đến.
  • Đọc danh sách số nguyên từ file.

2️⃣ Đếm tần số xuất hiện của từng số:

  • Dùng collections.Counter để đếm số lần xuất hiện của mỗi phần tử.

3️⃣ Tìm tần số lớn nhất:

  • Duyệt qua các giá trị trong Counter và lấy giá trị lớn nhất bằng max(freq.values()).

4️⃣ Ghi kết quả ra file:

  • In kết quả ra sys.stdout, kết quả sẽ được lưu vào “SAME.OUT”.

⏳ Độ phức tạp

  • Đọc dữ liệu: O(n)
  • Đếm tần số: O(n)
  • Tìm max: O(n)
  • Tổng: O(n) (rất tối ưu ✅).

👉 Tóm lại, ta chỉ cần duyệt danh sách 1 lần để đếm tần số và 1 lần để tìm giá trị lớn nhất. 🚀

 

Đáp án bài 2: Tách xâu – STRING.*

2.1 Đáp án bài 2:

import sys
sys.stdin = open("STRING.INP", "r")
sys.stdout = open("STRING.OUT", "w")
s = sys.stdin.readline().strip()
chu = []
so = []
# Phân loại ký tự
for i in s:
    if i.isalpha():
        chu.append(i)
    elif i.isdigit():
        so.append(i)
# Xử lý yêu cầu bài toán
chu.reverse()  # Đảo ngược thứ tự chữ cái
so.sort()  # Sắp xếp các chữ số theo thứ tự tăng dần
# Ghi kết quả ra file
print("".join(chu))
print("".join(so))

2.2 CÁCH GIẢI:

Phân tích bài toán

Bài toán yêu cầu:

  1. Tách các chữ cái trong xâu và đảo ngược thứ tự xuất hiện của chúng.
  2. Tách các chữ số trong xâu và sắp xếp chúng theo thứ tự tăng dần.

Cách giải

  • Duyệt qua từng ký tự của xâu:
    • Nếu là chữ cái, thêm vào danh sách chu.
    • Nếu là chữ số, thêm vào danh sách so.
  • Đảo ngược danh sách letters.
  • Sắp xếp danh sách digits theo thứ tự tăng dần.
  • Ghi kết quả ra file.

Độ phức tạp

  • Duyệt chuỗi O(n)
  • Đảo ngược danh sách chữ O(n)
  • Sắp xếp danh sách số O(k log k) (với k là số lượng chữ số, k ≤ n)
  • Tổng thể: O(n log n) ~ O(n) trong thực tế.

 

Đáp án Bài 3:  May mắn – LUCKY.*

3.1 Đáp án :

 

import sys
sys.stdin = open("LUCKY.INP", "r")
sys.stdout = open("LUCKY.OUT", "w")

def tinh_trung_binh_lan_can(ma_tran, i, j, m, n):
    lan_can = []
    huong = [(-1, 0), (1, 0), (0, -1), (0, 1)]  # Trái, phải, trên, dưới

    for dx, dy in huong:
        ni, nj = i + dx, j + dy
        if 0 <= ni < m and 0 <= nj < n:
            lan_can.append(ma_tran[ni][nj])

    return sum(lan_can) / len(lan_can) if lan_can else 0
m, n = map(int, sys.stdin.readline().split())
ma_tran = [list(map(int, sys.stdin.readline().split())) for _ in range(m)]

so_nguoi_may_man = 0

# Kiểm tra từng ô trong ma trận
for i in range(m):
    for j in range(n):
        trung_binh_lan_can = tinh_trung_binh_lan_can(ma_tran, i, j, m, n)
        if ma_tran[i][j] > trung_binh_lan_can:
            so_nguoi_may_man += 1

print(so_nguoi_may_man)

 

3.2 CÁCH GIẢI

Cách giải bài toán:

  1. Đọc dữ liệu đầu vào:
    • Đọc kích thước ma trận m x n.
    • Đọc các giá trị của ma trận từ file.
  2. Tính toán số người may mắn:
    • Với mỗi vị trí (i, j), tính trung bình cộng của các ô xung quanh (trái, phải, trên, dưới).
    • Nếu giá trị ở (i, j) lớn hơn trung bình đó, thì người ở vị trí đó là người may mắn.
  3. Xuất kết quả:
    • Ghi số lượng người may mắn ra file kết quả.

 

Đáp án bài 4:  Tam giác -TRIANGLE.*

4.1 Đáp án:

 

import sys, math

sys.stdin = open("TRIANGLE.INP", "r")
sys.stdout = open("TRIANGLE.OUT", "w")

# Đọc dữ liệu
n = int(sys.stdin.readline().strip())
que = list(map(int, sys.stdin.readline().split()))

dem_tam_giac = 0
dien_tich_lon_nhat = 0.0

# Duyệt mọi bộ 3 que khác nhau
for i in range(n - 2):
    for j in range(i + 1, n - 1):
        for k in range(j + 1, n):
            a = que[i]
            b = que[j]
            c = que[k]

            # Sắp xếp 3 cạnh
            x, y, z = sorted([a, b, c])

            # Kiểm tra điều kiện tam giác
            if x + y > z:
                dem_tam_giac += 1

                # Tính diện tích theo công thức Heron
                p = (x + y + z) / 2
                dien_tich = math.sqrt(p * (p - x) * (p - y) * (p - z))

                if dien_tich > dien_tich_lon_nhat:
                    dien_tich_lon_nhat = dien_tich

# Xuất kết quả
print(dem_tam_giac)
if dem_tam_giac == 0:
    print(-1)
else:
    print(f"{dien_tich_lon_nhat:.2f}")

✨ Ý tưởng bài toán

Alice có n que tính, chọn 3 que bất kỳ để ghép thành tam giác.

1️⃣ Điều kiện tạo thành tam giác

Với 3 cạnh a, b, c (đã sắp tăng dần):

a + b > c

2️⃣ Hai tam giác khác nhau

→ Chỉ cần khác chỉ số que tính, dù độ dài bằng nhau vẫn tính là khác.

3️⃣ Diện tích tam giác (Công thức Heron)

p = (a + b + c) / 2
S = sqrt(p * (p - a) * (p - b) * (p - c))

4️⃣ Yêu cầu

  • Đếm tổng số tam giác

  • Tìm diện tích lớn nhất

  • Nếu không có tam giác → in -1


🧠 Độ phức tạp

  • n < 100

  • Duyệt 3 vòng lặp:
    👉 O(n³) ≈ 100³ = 1.000.000 → chạy thoải mái

📌 Ví dụ minh họa

Input

5
1 4 5 2 3

Output

3
6.00

Input

3
1 2 3

Output

0
-1

🎯 Nhận xét chuẩn bài thi

✔ Đúng yêu cầu đề
✔ Không trùng tam giác
✔ Xử lý số thực chính xác
✔ In đúng định dạng
✔ Code rõ ràng – dễ chấm điểm

Đáp án bài 5: Hàng hóa – GOOD.*

5.1 Đáp án bài Hàng Hóa:

import sys
sys.stdin = open("GOOD.INP", "r")
sys.stdout = open("GOOD.OUT", "w")
n, m = map(int, sys.stdin.readline().split())
trong_luong = list(map(int, sys.stdin.readline().split()))

# Sap xep danh sach kien hang theo thu tu tang dan
trong_luong.sort()
trong_luong=trong_luong[::-1]
chon = []
tong_trong_luong = 0

# Duyet qua tung kien hang theo thu tu tang dan
for w in trong_luong:
    if tong_trong_luong + w <= m:  # Neu them kien hang vao van khong vuot tai trong
        chon.append(w)
        tong_trong_luong += w
    elif tong_trong_luong>m:
        break  # Neu qua tai thi dung

# Ghi ket qua ra file theo thu tu giam dan
print(*chon)

1. Mô tả bài toán (hiểu từ chương trình)

  • n kiện hàng, mỗi kiện có trọng lượng cho trước.

  • Xe có tải trọng tối đa là m.

  • Hãy chọn các kiện hàng sao cho:

    • Tổng trọng lượng không vượt quá m

    • Ưu tiên lấy các kiện nặng trước

  • In ra danh sách các kiện hàng được chọn.


2. Phân tích từng phần chương trình

🔹 Đọc dữ liệu

n, m = map(int, sys.stdin.readline().split())
trong_luong = list(map(int, sys.stdin.readline().split()))
  • n: số kiện hàng

  • m: tải trọng tối đa

  • trong_luong: danh sách trọng lượng các kiện


🔹 Sắp xếp danh sách kiện hàng

trong_luong.sort()
trong_luong = trong_luong[::-1]
  • Ban đầu sắp xếp tăng dần

  • Sau đó đảo ngược → giảm dần

  • Mục đích:

    • Xét kiện nặng trước

    • Áp dụng chiến lược tham lam (Greedy)


🔹 Biến hỗ trợ

chon = []
tong_trong_luong = 0
  • chon: lưu các kiện được chọn

  • tong_trong_luong: tổng trọng lượng hiện tại


🔹 Thuật toán chọn kiện hàng (Greedy)

for w in trong_luong:
if tong_trong_luong + w <= m:
chon.append(w)
tong_trong_luong += w
elif tong_trong_luong > m:
break

Ý tưởng thuật toán 💡

  • Duyệt từng kiện theo thứ tự trọng lượng giảm dần

  • Với mỗi kiện:

    • Nếu thêm vào không vượt quá tải trọng → chọn

    • Nếu đã vượt tải → dừng lại

👉 Đây là thuật toán tham lam:

  • Ở mỗi bước, chọn kiện nặng nhất có thể

  • Không quay lui, không xét lại


🔹 In kết quả

print(*chon)
  • In danh sách các kiện hàng được chọn

  • Thứ tự đã là giảm dần


3. Tóm tắt thuật toán

👉 Các bước chính:

  1. Đọc dữ liệu đầu vào.

  2. Sắp xếp các kiện hàng theo trọng lượng giảm dần.

  3. Lần lượt xét từng kiện:

    • Nếu thêm vào vẫn không vượt tải → chọn.

    • Nếu vượt tải → dừng.

  4. In ra các kiện đã chọn.


4. Độ phức tạp của chương trình

⏱️ Độ phức tạp thời gian

Công đoạnĐộ phức tạp
Sắp xếp danh sáchO(n log n)
Duyệt chọn kiệnO(n)
In kết quảO(n)

➡️ Tổng thời gian:

O(nlog⁡n)


💾 Độ phức tạp bộ nhớ

  • Danh sách trọng lượng: O(n)

  • Danh sách chọn: O(n)

➡️ Tổng bộ nhớ:

O(n)


5. Nhận xét theo chuẩn bài thi

✅ Thuật toán đơn giản – hiệu quả
✅ Phù hợp với bài toán có ràng buộc nhỏ và trung bình
✅ Dễ cài đặt, dễ hiểu, dễ chấm điểm

⚠️ Lưu ý:

  • Đây là bài toán tham lam, không đảm bảo tối ưu trong mọi trường hợp nếu đề yêu cầu tối đa tổng trọng lượng (bài toán cái túi 0/1).

  • Tuy nhiên, nếu đề yêu cầu ưu tiên kiện nặng, thuật toán là đúng.

 

Câu hỏi thường gặp về Tổng hợp 75 Đề thi HSG Tin học THCS Python

1. Bộ 75 đề thi HSG Tin học này có lời giải chi tiết (Full Code) không? Có. Toàn bộ 75 đề thi trong bài viết này đều đi kèm đáp án và mã nguồn (Source Code) được viết bằng ngôn ngữ lập trình Python. Chúng tôi cũng bổ sung các giải thích về thuật toán để các em học sinh hiểu rõ cách tư duy giải quyết vấn đề chứ không chỉ copy code.

2. Tài liệu này phù hợp cho học sinh lớp mấy? Bộ tài liệu này được biên soạn bám sát cấu trúc đề thi Học sinh giỏi cấp Huyện và cấp Tỉnh, phù hợp nhất cho học sinh khối THCS (Lớp 8, Lớp 9). Ngoài ra, học sinh lớp 6, 7 bắt đầu làm quen với Python nâng cao cũng có thể sử dụng để rèn luyện tư duy logic.

3. Tôi có thể tải file PDF đề thi và đáp án về máy tính không? Được. Ở cuối bài viết, Vi Tính Tấn Dân có cung cấp liên kết tải xuống trọn bộ tài liệu định dạng PDF để thầy cô và các em học sinh tiện in ấn và ôn tập offline.

4. Code Python trong bài viết sử dụng phiên bản nào? Các bài giải mẫu được viết tương thích tốt nhất với Python 3.x (phiên bản phổ biến nhất hiện nay trong giáo dục và thi cử). Bạn có thể chạy code trên các IDE thông dụng như Thonny, PyCharm, hoặc VS Code.

5. Ngoài Python, đề thi có đáp án bằng C++ hay Pascal không? Hiện tại, bài viết này tập trung chuyên sâu vào ngôn ngữ Python. Tuy nhiên, cấu trúc thuật toán là giống nhau. Nếu bạn cần tài liệu C++ hoặc Pascal, vui lòng tham khảo các chuyên mục khác trên website vitinhtandan.com hoặc để lại bình luận để chúng tôi hỗ trợ.

 

 

Nếu bạn thấy hay ! xin bạn 1 phút ! vui lòng đánh giá 5 sao cho trang website của chúng tôi ! để có động lực làm thêm nhiều bài hay nữa ! cảm ơn quý khách nhé !

Khóa học Python online từ cơ bản đến nâng cao