Subtask là một nhóm nhỏ các bộ dữ liệu kiểm tra (test) trong một bài toán lập trình.
Khi ra đề, ban tổ chức có thể chia các test thành nhiều nhóm khác nhau. Mỗi nhóm có những giới hạn dữ liệu riêng và có thể được quy định số điểm tương ứng.
Mục đích của việc chia Subtask là đánh giá khả năng giải bài toán của thí sinh ở nhiều mức độ khác nhau.
Ví dụ, một bài toán có tổng cộng 100 điểm được chia thành hai Subtask:
Nếu thí sinh giải đúng tất cả test của Subtask 1 nhưng không giải được Subtask 2, thí sinh có thể nhận được 70 điểm, tùy theo quy định chấm điểm của đề thi.
Test là một bộ dữ liệu dùng để kiểm tra chương trình.
Mỗi test thường bao gồm dữ liệu đầu vào và kết quả đầu ra tương ứng.
Ví dụ, bài toán tính tổng hai số có dữ liệu vào:
3 5
Kết quả đúng:
8
Nếu chương trình nhận dữ liệu 3 và 5 rồi in ra 8, chương trình vượt qua test này.
Nếu chương trình in ra 7, chương trình không vượt qua test này.
Một bài thi có thể có hàng chục hoặc hàng trăm test. Các test này được hệ thống chấm tự động sử dụng để đánh giá chương trình.
Không phải thuật toán nào cũng giải được mọi bộ dữ liệu trong giới hạn thời gian cho phép.
Một thuật toán có thể chạy tốt với số nhỏ nhưng chạy quá chậm khi số liệu tăng lên rất lớn.
Vì vậy, ban tổ chức có thể chia bài toán thành nhiều nhóm:
Cách chia này giúp thí sinh có cơ hội đạt điểm ngay cả khi chưa tìm được lời giải tối ưu cho toàn bộ bài toán.
Xét bài toán Tổng ước: Cho ba số nguyên dương a, b, c, yêu cầu tìm giá trị lớn nhất trong tổng các ước dương của ba số.
Đề bài ghi:
Có 70% số test thuộc nhóm mà cả ba số a, b, c đều không vượt quá 1.000.000.
Ta có:
106 = 1.000.000.
Ví dụ, bộ dữ liệu sau đáp ứng giới hạn của Subtask 1:
100 5000 1000000
Có 30% số test thuộc nhóm mà cả ba số a, b, c đều không vượt quá 1.000.000.000.000.
Ta có:
1012 = 1.000.000.000.000.
Ví dụ, bộ dữ liệu sau đáp ứng giới hạn của Subtask 2:
1000000000 50000000000 1000000000000
Lưu ý: Hai nhóm trên mô tả giới hạn dữ liệu. Nếu đề không nói rõ các nhóm loại trừ nhau hay cách chấm cụ thể, không nên tự suy ra rằng mọi test của Subtask 2 đều phải lớn hơn giới hạn Subtask 1.
Một test được xem là đạt khi chương trình đáp ứng yêu cầu của hệ thống chấm, bao gồm:
Nếu chương trình trả về kết quả sai, gặp lỗi khi chạy hoặc chạy quá thời gian, test đó có thể không được tính là đạt.
Các trạng thái thường gặp trên hệ thống chấm bài:
Tên trạng thái và mức độ chi tiết hiển thị có thể khác nhau giữa các hệ thống chấm.
Thông thường, nếu quy định chấm yêu cầu vượt qua toàn bộ test trong một Subtask thì thí sinh phải làm đúng tất cả test thuộc nhóm đó mới nhận được điểm của nhóm.
Ví dụ, một Subtask có 10 test:
Tuy nhiên, một số hệ thống hoặc kỳ thi có thể áp dụng cách tính điểm khác. Vì vậy, cần đọc quy định chấm điểm cụ thể.
Sau khi nộp bài, hệ thống sẽ chạy chương trình với các bộ dữ liệu kiểm tra và trả về kết quả.
Hệ thống có thể hiển thị số điểm hoặc trạng thái của từng nhóm.
Ví dụ minh họa:
Kết quả này cho biết chương trình đạt nhóm thứ nhất nhưng không nhận được điểm nhóm thứ hai.
Một số hệ thống chỉ hiển thị tổng điểm hoặc trạng thái của bài nộp. Trong trường hợp này, thí sinh có thể không biết chính xác mình trượt test nào hoặc trượt Subtask nào.
Do đó, không phải kỳ thi nào cũng cho phép thí sinh xem đầy đủ test và kết quả chi tiết.
Không. Cần phân biệt hai khái niệm:
Ví dụ, đề ghi 70% test không tự động có nghĩa là 70% điểm.
Trong bài Tổng ước đang xét, cách ghi 70% test và 30% test cho biết tỷ lệ test thuộc các nhóm. Muốn khẳng định mỗi nhóm được bao nhiêu điểm, cần xem thêm quy định chấm điểm của đề hoặc kỳ thi.
Trong nhiều đề thi lập trình, tỷ lệ test được dùng tương ứng với tỷ lệ điểm, nhưng không nên mặc định điều đó đúng với mọi đề.
Giới hạn dữ liệu ảnh hưởng trực tiếp đến việc lựa chọn thuật toán.
Ví dụ, với bài Tổng ước:
Cách 1: Duyệt tất cả các số từ 1 đến n để tìm ước.
Cách này có thể chấp nhận được với một số dữ liệu nhỏ, nhưng sẽ quá chậm khi n lên đến 1012.
Cách 2: Chỉ duyệt i từ 1 đến căn bậc hai của n.
Nếu i là ước của n thì n/i cũng là một ước. Nhờ vậy, ta có thể tìm các ước theo từng cặp mà không cần duyệt đến n.
Với n ≤ 1012, căn bậc hai của n bằng 106. Như vậy, mỗi số chỉ cần xét tối đa khoảng một triệu giá trị i.
Đây là cách làm hiệu quả hơn nhiều so với duyệt đến một nghìn tỷ.
LQDOJ: Là nền tảng chấm bài lập trình trực tuyến, giúp học sinh luyện tập thuật toán bằng các ngôn ngữ như C++, Python.
VNOI: Là cộng đồng Tin học Việt Nam, cung cấp tài liệu, bài tập và các hoạt động hỗ trợ học sinh luyện thi lập trình. Cách chấm bài phụ thuộc vào hệ thống hoặc kỳ thi cụ thể.
Codeforces: Là nền tảng luyện tập và thi đấu lập trình quốc tế. Hệ thống tự động chấm bài và có cơ chế xếp hạng người tham gia thi đấu.
Khi học sinh nộp chương trình, hệ thống thường thực hiện các bước sau:
| Trạng thái | Ý nghĩa |
|---|---|
| AC - Accepted | Bài được chấp nhận, vượt qua tất cả test cần đạt. |
| WA - Wrong Answer | Chương trình cho kết quả sai ở ít nhất một test. |
| TLE - Time Limit Exceeded | Chương trình chạy quá thời gian cho phép. |
| MLE - Memory Limit Exceeded | Chương trình sử dụng quá nhiều bộ nhớ. |
| RE - Runtime Error | Chương trình gặp lỗi trong quá trình chạy. |
| CE - Compilation Error | Chương trình không biên dịch được. |
Test là một bộ dữ liệu được dùng để kiểm tra chương trình.
Ví dụ, đề bài yêu cầu tính tổng hai số nguyên a và b.
Input: 3 5 Output: 8
Hệ thống có thể sử dụng nhiều test khác nhau:
| Test | Dữ liệu vào | Kết quả đúng |
|---|---|---|
| 1 | 3 5 | 8 |
| 2 | 10 20 | 30 |
| 3 | -2 7 | 5 |
| 4 | 0 0 | 0 |
Nếu chương trình chỉ đúng với test 1 nhưng sai với test 2, 3 hoặc 4 thì bài có thể bị WA hoặc không đạt toàn bộ điểm, tùy cách chấm.
Test ẩn là những bộ dữ liệu kiểm tra mà học sinh không được cung cấp đầy đủ khi nộp bài.
Mục đích của test ẩn là kiểm tra xem chương trình có giải quyết đúng bài toán trong nhiều trường hợp khác nhau hay không.
Ví dụ, chương trình tính tổng hai số có thể chạy đúng với các số nhỏ nhưng sai khi gặp số rất lớn do tràn kiểu dữ liệu int.
Vì vậy, học sinh không thể chỉ dựa vào một vài ví dụ trong đề để kết luận rằng chương trình đã đúng hoàn toàn.
Subtask là một nhóm test có chung những điều kiện hoặc giới hạn dữ liệu nhất định. Đề bài có thể chia thành nhiều Subtask với số điểm khác nhau.
Ví dụ, một bài có N là số nguyên dương và được chia thành ba Subtask:
| Subtask | Điều kiện | Điểm |
|---|---|---|
| 1 | N ≤ 100 | 30 điểm |
| 2 | N ≤ 100000 | 30 điểm |
| 3 | N ≤ 10^12 | 40 điểm |
| Tổng | 100 điểm | |
Các điều kiện trên là ví dụ minh họa. Điều kiện thực tế phải theo đề bài.
Học sinh cần xem kết quả chấm bài mà hệ thống trả về.
Ví dụ, giả sử kết quả chấm theo từng Subtask như sau:
| Subtask | Kết quả | Điểm |
|---|---|---|
| 1 | Đạt toàn bộ test | 30/30 |
| 2 | Đạt toàn bộ test | 30/30 |
| 3 | Không đạt điều kiện chấm | 0/40 |
| Tổng điểm | 60/100 | |
Trong ví dụ này, học sinh đạt 60 điểm trên tổng số 100 điểm.
Lưu ý: Đây là ví dụ về cách tính điểm theo Subtask, không phải quy tắc bắt buộc của tất cả hệ thống. Một số đề chấm điểm theo từng test hoặc sử dụng cách tính điểm riêng.
Không.
Ví dụ trong đề chỉ là một số trường hợp minh họa. Hệ thống có thể kiểm tra thêm nhiều dữ liệu khác, bao gồm dữ liệu lớn, dữ liệu nhỏ nhất, dữ liệu đặc biệt và những trường hợp dễ làm chương trình sai.
Muốn đạt điểm cao, học sinh cần:
| Tiêu chí | LQDOJ | VNOI | Codeforces |
|---|---|---|---|
| Mục đích | Luyện tập và chấm bài trực tuyến | Cộng đồng và tài nguyên luyện thi Tin học | Luyện tập và thi đấu lập trình |
| Chấm tự động | Có | Tùy hệ thống chấm được sử dụng | Có |
| Kết quả AC, WA | Có thể gặp | Tùy hệ thống | Có |
| Chấm theo Subtask | Tùy bài và cấu hình | Tùy bài và hệ thống | Tùy bài và hình thức chấm |
| Xếp hạng thi đấu | Tùy cuộc thi | Tùy hoạt động | Có hệ thống Rating |
Khi luyện thi lập trình, học sinh cần hiểu rõ sáu khái niệm quan trọng:
Hiểu được cách chấm bài giúp học sinh biết vì sao chương trình bị sai, vì sao chưa đạt điểm tối đa và cần cải thiện thuật toán như thế nào.
Trang web luyện tập và chấm bài lập trình trực tuyến.
Cung cấp tài liệu, kiến thức thuật toán và tài nguyên luyện thi Tin học.
Nền tảng luyện tập và thi đấu lập trình quốc tế, có hệ thống chấm bài tự động và xếp hạng người tham gia.
Lưu ý: Một số trang có thể yêu cầu đăng ký tài khoản để nộp bài hoặc tham gia thi đấu.
TÌM HIỂU VỀ SUBTASK TRONG LẬP TRÌNH THI ĐẤU, Cách chấm bài lập trình: LQDOJ, VNOI, CODEFORCES, Link các trang web luyện lập trình