Wiki Bắt đầu Định dạng test (Input/Output)

Định dạng test (Input/Output)

huunguyen huunguyen Updated Tháng tư 17, 2026

Trên CTOJ, mỗi bài toán được chấm bằng các test case — mỗi test gồm một file input và một file output chuẩn. Chương trình của bạn đọc dữ liệu từ stdin (bàn phím) và in kết quả ra stdout (màn hình). Bài viết này giải thích các quy ước về định dạng test trên CTOJ.

Cách hoạt động

  1. Hệ thống đưa nội dung file input vào stdin của chương trình.
  2. Chương trình xử lý và in kết quả ra stdout.
  3. Hệ thống so sánh stdout của bạn với file output chuẩn.
  4. Nếu khớp → AC (Accepted). Nếu không khớp → WA (Wrong Answer).

Bạn không cần mở file hay ghi file. Chỉ cần đọc từ stdin và in ra stdout.

Đọc dữ liệu (Input)

C++

Dùng scanf hoặc cin:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    scanf("%d", &n);  // đọc một số nguyên

    vector<int> a(n);
    for (int i = 0; i < n; i++)
        scanf("%d", &a[i]);  // đọc n số nguyên
}

Hoặc dùng cin (chậm hơn nếu không tắt sync):

#include <bits/stdc++.h>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int n;
    cin >> n;

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

Dùng input() hoặc sys.stdin:

import sys
input = sys.stdin.readline  # nhanh hơn input() mặc định

n = int(input())
a = list(map(int, input().split()))
Java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int[] a = new int[n];
        for (int i = 0; i < n; i++)
            a[i] = sc.nextInt();
    }
}

Dùng BufferedReader sẽ nhanh hơn đáng kể cho input lớn:

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine().trim());
        StringTokenizer st = new StringTokenizer(br.readLine());
        int[] a = new int[n];
        for (int i = 0; i < n; i++)
            a[i] = Integer.parseInt(st.nextToken());
    }
}

In kết quả (Output)

C++
printf("%d\n", result);   // printf
cout << result << "\n";   // cout (dùng "\n" thay endl để nhanh hơn)
Python
print(result)
Java
System.out.println(result);

Các định dạng input phổ biến

Một dòng nhiều số
5 3 10

→ Đọc: scanf("%d %d %d", &a, &b, &c) hoặc a, b, c = map(int, input().split())

Dòng đầu là số lượng, dòng sau là dãy số
5
1 3 2 5 4

→ Đọc: dòng 1 cho n, dòng 2 cho mảng n phần tử.

Đồ thị (danh sách cạnh)
5 6
1 2
1 3
2 4
3 4
4 5
3 5

→ Dòng 1: n đỉnh, m cạnh. m dòng tiếp theo, mỗi dòng là một cạnh.

Nhiều test case trong một file
3
4
1 2 3 4
3
5 6 7
2
10 20

→ Dòng 1: số test T. Sau đó lần lượt đọc T test case.

Ma trận
3 4
1 2 3 4
5 6 7 8
9 10 11 12

→ Dòng 1: n hàng, m cột. n dòng tiếp theo, mỗi dòng m số.

Chuỗi
5
abcde

→ Dòng 1: độ dài chuỗi (hoặc không có, tùy bài). Dòng 2: chuỗi.

Các định dạng output phổ biến

Một số duy nhất
42
Nhiều số trên một dòng (cách nhau bởi dấu cách)
1 3 2 5 4
Mỗi số trên một dòng
1
3
2
5
4
YES / NO
YES

⚠️ Chú ý viết hoa/thường đúng theo yêu cầu đề bài. YESYesyes.

Số thực
3.141593

Thường đề yêu cầu sai số tuyệt đối/tương đối 106. Dùng printf("%.9f\n", x) trong C++ hoặc print(f"{x:.9f}") trong Python.

Nhiều dòng kết quả

Một số bài yêu cầu in nhiều dòng (ví dụ: in ma trận, in đường đi, ...). Mỗi dòng output tương ứng với một phần kết quả.

Lưu ý quan trọng

Khoảng trắng và xuống dòng
  • Các số trên cùng dòng cách nhau bởi đúng một dấu cách.
  • Mỗi dòng kết thúc bằng ký tự xuống dòng \n.
  • Không in thêm dấu cách thừa ở cuối dòng hoặc dòng trống thừa ở cuối output (hệ thống thường bỏ qua khoảng trắng thừa ở cuối, nhưng tốt nhất nên in đúng).
Kiểu dữ liệu
  • Nếu N109 → dùng int (C++/Java).
  • Nếu N1018 → dùng long long (C++) hoặc long (Java). Python tự xử lý số lớn.
  • Luôn đọc kỹ ràng buộc để chọn kiểu dữ liệu phù hợp. Tràn số (overflow) là lỗi rất phổ biến.
Tốc độ I/O

Với bài có input lớn (>105 dòng):

  • C++: Dùng scanf/printf hoặc thêm ios_base::sync_with_stdio(false); cin.tie(NULL); nếu dùng cin/cout.
  • Python: Dùng sys.stdin.readline thay cho input(). Dùng sys.stdout.write thay cho print() nếu cần in nhiều dòng.
  • Java: Dùng BufferedReader + StringTokenizer thay cho Scanner.

Ví dụ hoàn chỉnh

Đề bài: Cho n số nguyên, tìm tổng của chúng.

Input:

3
1 2 3

Output:

6

Code C++:

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    scanf("%d", &n);
    long long sum = 0;
    for (int i = 0; i < n; i++) {
        int x;
        scanf("%d", &x);
        sum += x;
    }
    printf("%lld\n", sum);
}

Code Python:

import sys
input = sys.stdin.readline

n = int(input())
a = list(map(int, input().split()))
print(sum(a))

Các dạng bài đặc biệt

Bài có nhiều đáp án đúng

Một số bài chấp nhận nhiều đáp án khác nhau (ví dụ: in một hoán vị thỏa điều kiện). Các bài này sử dụng checker đặc biệt — hệ thống không so sánh từng ký tự mà kiểm tra tính đúng đắn của đáp án.

Bài tương tác (Interactive)

Một số bài yêu cầu chương trình hỏi đáp với hệ thống. Chương trình gửi truy vấn qua stdout, nhận phản hồi từ stdin, và lặp lại cho đến khi tìm ra đáp án. Khi làm bài tương tác, cần flush output sau mỗi truy vấn:

  • C++: fflush(stdout) hoặc cout << flush
  • Python: print(query, flush=True)
  • Java: System.out.flush()
Bài gọi hàm (Signature/Function)

Một số bài yêu cầu bạn chỉ viết một hàm thay vì chương trình hoàn chỉnh. Hệ thống sẽ gọi hàm của bạn với các tham số đã cho và kiểm tra giá trị trả về. Bạn không cần đọc input hay in output — chỉ cần cài đặt đúng hàm theo yêu cầu.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.46 awk 1.3.4 gcc 16.1.0 csc 6.12.0.200 g++ 16.1.0 g++-themis 16.1.0 g++17 16.1.0 g++20 16.1.0 g++23 16.1.0 clang++ 22.1.6 dmd 2.112.0 dart 3.12.1 gforth 0.7.3 gfortran 12.2.0 go 1.26.3 groovyc 5.0.6 javac 25.0.3 node 26.2.0 kotlinc 2.3.21 sbcl 2.2.9 lua 5.4.8 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.6 pike 8.0 pypy3 7.3.23 python3 3.14.5 racket 8.7 ruby 4.0.5 rustc 1.96.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 tclsh 8.6 bun 1.3.14 deno 2.8.1 v 0.5.1 zig 0.16.0