# Buổi 8 - Đề vui vẻ
## Bài 1
Liệt kê các cách làm khác nhau :smile:
- Dùng Set (trong C++ và Python)
- Sort lại xong đếm số phần tử khác trước đó
- Đếm phân phối nếu như $x \le 10^6$ - `map<int,int>` của C++ hoặc `dict` của Python
## Bài 2
Cày trâu: Dùng hai vòng lặp For để thử ra tất cả các bộ
Bài toán: Có tồn tại abc ... trong dãy số ... hay không?
--> Dùng Flag (một biến boolean) sẽ giải quyết được những vấn đề sau:
- Trường hợp: Không có lời giải
- Trường hợp: Có nhiều lời giải, in lặp lại nhiều lần (đề chỉ bảo in 1 lần)
```
Mã giả:
1. Đọc vào Input
2. Gán Flag = 0 (Nghĩa là chưa tìm thấy, 1 là tìm thấy rồi)
3. Chạy for i và for j
4. Nếu a[i] + a[j] == x
4a. Nếu Flag == 0: In ra đáp án
4b. Gán Flag = 1 Đánh dấu đã tìm thấy một đáp án rồi
5. Kết thúc for. Nếu Flag == 0. Kết luận rơi vào Trường hợp: Không có lời giải.
```
**Cách viết khác:** Định nghĩa một hàm và `return` hàm ngay khi tìm thấy lời giải

**Subtask full**
**Cách 1: Dùng `map` của C++ hoặc `dict` của Python**
- Chú ý trường hợp không tồn tại Khóa trong `dict` của Python
- `map<int,int> M`. Nếu gọi `M[x]` lần đầu $x$ chưa xuất hiện trong $M$ thì mặc định `M[x] = 0`
**Cách 2: Tìm kiếm nhị phân và hai con trỏ**
- Điều kiện: Giá trị phải tăng dần
- Vấn đề: Khi sắp xếp tăng theo giá trị, thứ tự ban đầu bị mất đi?
- Giải pháp:
- Python: `for i in range(n): b.append( (a[i],i) )` (Tạo tuple và sort theo keys)
- C++: Lưu `pair<int,int>`. `b[i].first` lưu giá trị còn `b[i].second` lưu vị trí
- Orz nhatbm:
## Bài 3
Vì sao C++ có main mà Python không có?
- nó không yêu cầu!
- `if __name__ == "main"`