Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 12 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
12
Dung lượng
914,27 KB
Nội dung
KĨ THUẬT GHI NHỚ, CỘNG DỒN Giáo viên: Nguyễn Như Thắng- THPT Chuyên Lào Cai Việc lưu trữ thông tin cần nhớ cho lấy lại chúng cách nhanh kỹ để có chương trình hiệu Tuy việc nhớ lưu trữ lại đòi hỏi nhạy bén toán học học sinh Điều lại hình thành sau học sinh tiếp xúc với hệ thống toán tổ chức cẩn thận Hệ thống giúp học sinh xây dựng thói quen tư kỹ thuật lập trình Dưới đây, tơi trình bày hệ thống tập phân loại nhằm mục đích hình thành cho em kỹ nói Ưu điểm kĩ thuật đánh dấu, ghi nhớ: lấy thông tin lưu trữ thời gian O(1) Một số tập hình thành kĩ 1.1 Bài toán 1: Cho mảng n số nguyên dương 𝑎1 , 𝑎2 , , 𝑎𝑛 (1 ≤ 𝑛 ≤ 106 , 𝑎𝑖 ≤ 106 ) số nguyên dương 𝑆 (𝑆 ≤ 106 ) Hãy đếm xem có cặp (𝑎𝑖 , 𝑎𝑗 ) thỏa mãn 𝑎𝑖 + 𝑎𝑗 = 𝑆 Ví dụ: Input Output 52 10 11111 a) Hướng dẫn thuật toán - Thuật toán 1: Do biểu thức cần thỏa mãn 𝑎𝑖 + 𝑎𝑗 = 𝑆 có chứa số 𝑖, 𝑗 cách đơn giản mà học sinh nghĩ tới dùng vịng lặp để đếm xem có cặp có tổng 𝑆 Độ phức tạp 𝑂(𝑛2 ) for(int i = 1; i < n; i++) for(int j = i + 1; j a[i]; //doc du lieu res = res + cnt[s - a[i]]; //tang ket qua cnt[a[i]]++; //dem so lan a[i] xuat hien } Đây gọi kĩ thuật phân li ẩn số, ban đầu số nằm vế đẳng thức 𝑎𝑖 + 𝑎𝑗 = 𝑆 Sau ta phân li ẩn số sau: Trang 𝑎𝑖 = 𝑆 − 𝑎𝑗 Mỗi đọc số 𝑎𝑗 vào ta đánh dấu xem xuất lần, với 𝑎𝑗 ta đếm xem có số 𝑆 − 𝑎𝑗 xuất b) Chương trình đầy đủ #include using namespace std; long long res, a[10001], n, s, cnt[10001]; int main() { cin >> n >> s; cnt[0] = 1; for(int i = 1; i > a[i]; //doc du lieu res = res + cnt[s - a[i]]; //tang ket qua cnt[a[i]]++; //dem so lan a[i] xuat hien } cout