# 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 ![image](https://hackmd.io/_uploads/rkBg1b7nyl.png) **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"`