1

CLAOJ Wiki - Một số tips dành cho lập trình thi đấu C++

đã đăng vào 9, Tháng 7, 2023, 12:43

1. Sử dụng thư viện bits/stdc++.h

  • C++ có rất nhiều thư viện, để sử dụng các hàm hay cấu trúc dữ liệu ta cần phải khai báo thư viện chứa các cấu trúc dữ liệu/hàm tương ứng. Ví dụ:
#include <iostream>
#include <vector>
#include <set>
#include <string>
using namespace std;

int main(){
    cout << "Hello CLAOJ!";
    return 0;
}
  • Trong đó:

    • Thư viện iostream được dùng cho các lệnh nhập - xuất trong C++.
    • Thư viện vector dùng cho các thao tác trên cấu trúc dữ liệu vector trong C++.
    • Và tương tự với các cấu trúc dữ liệu khác như string, set,...
  • Để tránh việc phải khai báo quá nhiều thư viện khi code C++, ta có thể khai báo một thư viện duy nhất là bits/stdc++.h. Đây là một thư viện lớn chứa tất cả các thư viện chuẩn của C++. Thư viện bits/stdc++.h vô cùng hữu dụng vì tiết kiệm thời gian khai báo từng thư viện, đặc biệt là trong Lập trình thi đấu.

#include <bits/stdc++.h>

2. Sử dụng #define

  • Khi lập trình C++, chắc hẳn sẽ có những câu lệnh bạn phải viết đi viết lại nhiều lần. Để tiết kiệm thời gian khi gọi những câu lệnh này, ta có thể sử dụng lệnh #define trong C++.
  • Ví dụ:
#include <bits/stdc++.h>
using namespace std;

int main(){
    for (int i = 1; i <= 10; i++){
        cout << "Hello CLAOJ!" << endl;
    }
    for (int i = 1; i <= 10; i++){
        cout << "Happy coding!" << endl;
    }
}

có thể viết gọn bằng cách sử dụng lệnh #define như sau:

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

#define FOR(i,a,b) for (int i = (a); i <= (b); i++)

int main(){
    FOR(i,1,10){
        cout << "Hello CLAOJ!" << endl;
    }
    FOR(i,1,10){
        cout << "Happy coding!" << endl;
    }
}

3. Sử dụng toán tử điều kiện ?:

  • Toán tử điều kiện ?: có chức năng tương tự như cấu trúc if-else. Sử dụng các toán tử điều kiện thay cho cấu trúc if-else giúp code ngắn gọn và tiết kiệm thời gian hơn.
  • Ví dụ:
cout << (a > b ? a : b);

tương đương với

if (a > b) {
    cout << a;
} else {
    cout << b;
}

4. Sử dụng các toán tử trên bit

  • Kiểm tra tính chẵn/lẻ của một số. Ví dụ:
if (num % 2 != 0){
    cout << "le"; 
} else {
    cout << "chan";
}

tương đương với

if (num & 1){
    cout << "le";
} else {
    cout << "chan";
}
  • Nhân/chia cho 2 bằng phép dịch bit. Ví dụ:
int m = x >> 1; // tương đương với int m = x/2;
int n = x << 1; // tương đương với int n = x*2;

5. Sử dụng từ khóa auto

  • Từ khóa auto có thể được sử dụng như một kiểu dữ liệu. Ví dụ:
int a = 21;
long long b = 12345678901234567890;
char c = 'c';
double d = 3.14;
string s = "CLAOJ";

có thể được khai báo như sau:

auto a = 21;
auto b = 12345678901234567890;
auto c = 'c';
auto d = 3.14;
auto s = "CLAOJ";

Lưu ý: Từ khóa auto chỉ dùng được cho phiên bản C++11 trở đi.

6. Viết tắt vòng lặp khi duyệt qua tất cả các phần tử trong mảng/vector

  • Thông thường, khi cần duyệt qua tất cả các phần tử trong mảng/vector, ta thường sử dụng vòng lặp for. Vòng lặp này có thể viết gọn hơn, ví dụ:
for (int i = 0; i < v.size(); i++){
    cout << v[i] << ' ';
}

Cách viết trên tương đương với

for (int i : v){
    cout << i << ' ';
}

Để thay đổi và can thiệp vào giá trị của mảng/vector ta kết hợp dùng con trỏ

for (int &i : v){
    i++;
}

Khi này các giá trị trong mảng sẽ được tăng lên một đơn vị

7. Sử dụng &&|| thay cho từ khóa andor

  • Các từ khóa andor thường sử dụng trong cấu trúc if-else có thể thay thế bằng &&||. Ví dụ:
if (a == true && b == true) // tương đương với if (a == true and b == true)
    cout << "true";
if (a == false || b == false) // tương đương với if (a == false or b == false)
    cout << "false";

8. Sử dụng lệnh exit(0) để thoát khỏi chương trình

  • Lệnh exit(0) cho phép bạn thoát chương trình bất cứ khi nào bạn gọi hàm này. Ví dụ:
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n = 10;
    if (n == 10){
        cout << "Exit";
        exit(0);
    }
    cout << "End";
    return 0;
}

Output:

Exit
  • Trong đoạn code trên, chương trình chỉ thực hiện các câu lệnh từ đầu đến exit(0), sau đó thoát khỏi chương trình. Các câu lệnh sau exit(0) sẽ không được thực thi.

9. Sử dụng ,

  • Trong lập trình C++, ta có thể sử dụng dấu , để viết các câu lệnh liên tiếp nhau mà không cần xuống dòng hay dùng dấu ; ở cuối lệnh. Ví dụ:
#include <bits/stdc++.h>
using namespace std;

int main(){
    int x;
    for (int i = 1; i <= 10; ++i)
        cin >> x, cout << x << '\n';
    return 0;
}

Đoạn code trên tương đương với

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

int main(){
    int x;
    for (int i = 1; i <= 10; ++i){
        cin >> x;
        cout << x << '\n';
    } 
    return 0;
}

10. Viết hàm (chương trình con) không cần truyền biến tham số

  • Trong Lập trình thi đấu, việc viết hàm/chương trình con là một việc quen thuộc, đặc biệt là trong kỹ thuật Đệ quy, việc viết và gọi các hàm này là bắt buộc.
  • Với những hàm đệ quy có sẵn giá trị bắt đầu, ta có thể truyền thẳng giá trị đó vào hàm.
  • Ví dụ: Ta có hàm đệ quy:
void Try(int k){
    // your code
    ...
}

Thay vì gọi hàm đệ quy trong chương trình chính là

int main(){
    // your code
    Try(0);
    ...
}

Ta có thể truyền giá trị bắt đầu bằng $0$ vào hàm đệ quy như sau:

void Try(int k = 0){
    // your code
    ...
}

Khi đó, trong chương trình chính bạn chỉ cần gọi hàm đệ quy như sau:

int main(){
    // your code
    Try();
    ...
}

Cảm ơn các bạn đã đọc. Hi vọng bài viết này hữu ích với các bạn!

Happy coding, CLAOJ.

Nguồn tham khảo:

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.