Các bài toán giải thuật nâng cao

104 1K 0
Các bài toán giải thuật nâng cao

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

3 Các bài toán nâng cao 2 3.1 Lũy thừa 2, 3, 5 2 3.2 Số hoàn thiện 6 3.3 Phân tích số lớn 12 3.4 Bâc cao 16 3.5 Lũy thừa 20 3.6 Ba lô 27 3.7 Balô đơn giản 37 3.8 Hình Vuông và Tam Giác 40 3.9 Chiều dài của giai thừa 43 3.10 Số ước chẵn lẻ 48 3.11 Operators (Toán tử) 49 3.12 Người thắng cử 58 3.13 Cặp điểm gần nhất 60 3.14 Mọi đường ngắn nhất 67 3.15 Đường đi và chu trình Euler. 71 3.16 Du hành 86

MỤC LỤC Các toán nâng cao 3.1 Lũy thừa 2, 3, 3.2 Số hoàn thiện 3.3 Phân tích số lớn 12 3.4 Bâc cao .16 3.5 Lũy thừa .20 3.6 Ba lô 27 3.7 Balô đơn giản .37 3.8 Hình Vuông Tam Giác 40 3.9 Chiều dài giai thừa 43 3.10 Số ước chẵn lẻ 48 3.11 Operators (Toán tử) 49 3.12 Người thắng cử 58 3.13 Cặp điểm gần 60 3.14 Mọi đường ngắn .67 3.15 Đường chu trình Euler 71 3.16 Du hành 86 Các toán nâng cao 3.1 Lũy thừa 2, 3, Dijkstra E Xét dãy số s tăng gồm 1000 số tích lũy thừa 2, 5, tức số có dạng 2a3b5c, a, b, c = 0, 1, 2, … s = 1, 2, 3, 4, 5, 6, 8, 9, 10, 12, … Với giá trị nguyên dương k cho trước, cho biết dãy s có số có k ước Chú thích Bài nguyên gốc Dijkstra đề xuất đòi hỏi hiển thị dãy s Chúng ta sửa lại nội dung đôi chút nhằm minh họa thao tác xử lý ước Thí dụ Với n = 1000; k = 250 ta có số có 250 ước số Số Dạng lũy thừa Số ước 23328000 283653 252 31104000 2103553 264 34992000 273753 256 37324800 2113652 252 38880000 283554 270 41472000 2123453 260 46656000 293653 280 48600000 263555 252 49766400 2133552 252 Thuật toán Theo đầu bài, ta tạm giả thiết dãy s gồm vô hạn số tích lũy thừa 2, 5, s có tính chất sau:  Dãy s tăng;  Dãy s chứa số nhỏ nhất, ứng với 203050;  Nếu s chứa số v = 2m3n5p s phải chứa số 2v = 2m+13n5p, 3v = 2m3n+15p 5v = 2m3n5p+1 Do yêu cầu tăng nên s có dạng sau đây: 1, , v, , 2v, , 3v, , 5v, Chú ý 2v < 3v không thiết 2v phải đứng sát sau v Giả sử ta có y = m’3n’5p’ thuộc s 2y = m’+1 n’ p’ > v dãy s phải có dạng sau đây: 1, ,y, , v, , 2y, Ta có z thuộc s 3z > v, t thuộc s 5t > v Tổng hợp lại ta thấy, ta sinh dãy s = 1, s2 = 2, ,si−1 = v để tính phần tử si ta phải xác định ba số s[a], s[b], s[c] dãy s[1 i−1] cho:  2s[a] giá trị vượt v, tức 2s[a] > v;  3s[b] giá trị vượt v, tức 3s[b] > v;  5s[c] giá trị vượt v, tức 5s[c] > v; Khi đó, s[i] = max{2s[a], 3s[b], 5s[c]} Một xác định phần tử v = m3n5p dãy s ta tính số ước v (m+1)(n+1) (p+1) Như ta cần ba biến a, b c để theo dõi số dãy s ứng với thừa số nguyên tố 2, dãy Ngoài mảng s, ta cần thêm mảng m2, m3 m5 để chứa số mũ phần tử v dãy s Chú ý hàm Min3(x,y,z) không cho ta giá trị nhỏ số nguyên x, y z mà cho ta vị trí chứa 1, để hiểu tham biến thứ tham biến x, y, z đạt trị Thí dụ, Min3(15, 12, 25) = 2; Min3(12,25,15) = 1; Min3(25,15,12) = Chương trình C++ // P235.CPP #include #include #include using namespace std; const int MN = 1002; int s[MN],m2[MN],m3[MN],m5[MN]; int Min3(int x, int y, int z){ int m = 1; if (x > y) { x = y; m = 2; } // x = (x,y) return (x k int Pow235(int k) { int i, v; int a, b, c; // cac chi so cho 2, 3, int d = 0; // dem cac so co so uoc > k // Khoi tri a = b = c = 1; v = s[1] = 1; m2[a] = m3[b] = m5[c] = 0; // Xu li day s[2 1000] for (i = 2; i [...]... a[5]) = (2, 1, 3); Dãy thứ năm: (a[3], a[5], a[6]) = (2, 3, 1) Thuật toán Bài toán Ba lô hiện mới có thuật toán với độ phức tạp cỡ 2 n, nghĩa là để tìm nghiệm ta phải duyệt mọi tập con các chỉ số của n chỉ số Dưới đây sẽ khảo sát hai tiếp cận: tiếp cận quay lui và tiếp cận nhánh cận Quay lui Ta sử dụng một ngăn xếp x để lưu chỉ số của các vật được chọn vào ba lô Với thí dụ đã cho thì nghiệm thứ ba... writeln; end; close(f); end; BEGIN Run; writeln(' F I N I ! '); readln; END Kết quả 3.4 Bâc cao Cho số nguyên dương n Hãy cho biết trong dạng phân tích ra thừa số nguyên tố thì giá trị lớn nhất của số mũ m là bao nhiêu Nếu n = 805306368 thì m = 28 vì 805306368 = 3.228 Thuật toán 16 Ta thực hiện lại thuật toán trong bài 3.3 với chỉnh sửa nhỏ sau đây: Thay vì phân tích ra thừa số ta chỉ lấy số mũ (bậc) max... 3 Nếu t < m thì tồn tại một số i nhỏ nhất để n = it chính là số nhỏ nhất để nn chia hết a Từ các nhận xét trên ta xây dựng được thuật toán sau: • Bước 1 Phân tích a ra thừa số nguyên tố Gọi p1, p2, …, pk là các thừa số nguyên tố trong dạng phân tích của a Tính t = p1p2…pk và tính m là giá trị lớn nhất trong các số mũ mi , i = 1, 2, , k • Bước 2 Nếu t ≥ m thì lấy kết quả n = t, nếu không thì tìm i đầu... trước các giá trị t[i] = tổng trọng lượng của các vật từ i đến n Ta gọi t[i] là trọng lượng của hậu tố i Phương án 2 khá giống với phương án 1 ngoại trừ hai chi tiết quan trọng sau đây: 1 Xét điều kiện s+t[k+1] ≥ m trước khi quyết định có duyệt tiếp dãy các vật từ k+1 đến n 2 Khi dỡ các vật trên cùng của ngăn xếp là n, n-1, …, n-i ta không phải giảm ngay trọng lượng ba lo vì ta đã tính trước các giá... Tong cong: 4 so Thoi gian tinh: 9 3.3 Phân tích số lớn Mục này trình bày một thuật toán cải tiến để có thể phân tích nhanh một số lớn ra thừa số nguyên tố Chúng ta cần đáp ứng được hai tiêu chí tưởng như đối nghịch nhau sau đây:  Chỉ đòi hỏi Sieve sinh các số nguyên tố trong khoảng 1 150 ngàn, nhưng  có thể phân tích ra thừa số các số đến 2 tỷ Chương trình sẽ được thực hiện trên 14 test sau đây Với mỗi... nghiệm Muốn vậy, ta cần có thêm các thông tin bổ sung Dễ thấy, khi đã chọn được j vật trong khoảng 1 k để xếp vào ba lô ta cần duyệt tiếp các vật k+1…n Gọi trọng lượng hiện có của ba lô là s, tổng trọng lượng của các vật chưa duyệt từ k+1 đến n là t[k+1], để quyết định có duyệt tiếp hay không ta cần xét điều kiện s+t[k+1] ≥ m? Thật vậy, nếu s+t[k+1] < m thì dù ta có xếp toàn bộ các vật k+1 n vào ba lô ta... 461590641 3^2.51287849 12 828696141 3^2.7.13.23.29.37.41 13 625718308 2^2.156429577 14 805306368 2^28.3 Thuật toán 12  Bước 1 Gọi hàm Sieve(MN) để nhận các số nguyên tố trong khoảng 1 MN, với MN = 150000 Để ý rằng (15.104)2 = 225.108 vượt quá giới hạn của số nguyên dương 32 bit  Bước 2 Lần lượt xét các số nguyên tố p[i] trong khoảng 1 n và với điều kiện n > 1: Nếu n chia hết cho p[i] thì gọi hàm CDegree(n,... 3.6 Ba lô Cho một balô có sức chứa m Hãy hiển thị mọi phương án chọn từ n vật có trọng lượng biết trước để xếp vừa đủ vào balô Bài toán kinh điển này có nhiều tên gọi, nhưng có lẽ tên ba lô đã Việt hóa từ Kháng chiến chống Pháp thì được nhiều người cảm tình Một dạng khác của bài này được phát biểu như sau : Tổng dãy con Cho dãy số nguyên dương a[1 n] và một số nguyên dương m Hãy xác định những dãy con... vật được chọn vào ba lô Với thí dụ đã cho thì nghiệm thứ ba sẽ là x[1 4] = (2, 4, 5, 6), với ý nghĩa là có 4 vật được chọn vào ba lô là vật 2, 4, 5 và 6 Thuật toán là một vòng lặp gồm hai pha • Pha tiến: Duyệt từ vật i = k+1 n để chọn và xếp vào ba lô các vật i sao cho ba lô có trọng lượng s không vượt quá sức chứa m Tại cuối pha này xét điều kiện s = m? Nếu đạt thì chấp nhận thêm 1 nghiệm • Pha lùi:... power.inp power.out 15 1 4 8 12 100 1024 255255 17631601 461590641 999999999 828696141 387420489 625718308 872825381 805306368 1 2 4 6 10 8 255255 4199 153863547 37037037 276232047 9 312859154 872825381 24 Thuật toán Phương pháp 1 Duyệt toàn bộ for (n = 1; n

Ngày đăng: 06/09/2016, 17:43

Từ khóa liên quan

Mục lục

  • 3 Các bài toán nâng cao

    • 3.1 Lũy thừa 2, 3, 5

      • Chú thích

      • Thí dụ

      • Thuật toán

      • Chương trình C++

      • Chương trình Pascal

    • 3.2 Số hoàn thiện

      • Thuật toán

      • Nhận xét

      • Chương trình C++

      • Chương trình Pascal

      • Kết quả

    • 3.3 Phân tích số lớn

      • Thuật toán

      • Chương trình C++

      • Chương trình Pascal

      • Kết quả

    • 3.4 Bâc cao

      • Chương trình C++

      • Chương trình Pascal

      • Kết quả

    • 3.5 Lũy thừa

      • Thuật toán

      • Chương trình C++

      • Chương trình Pascal

    • 3.6 Ba lô

      • Thuật toán

      • Quay lui

      • Chương trình C++

      • Chương trình Pascal

      • Chương trình C++

      • Chương trình Pascal

      • Nhánh cận

      • Chương trình C++

      • Chương trình Pascal

      • Chương trình C++

      • Chương trình Pascal

    • 3.7 Balô đơn giản

      • Chương trình C++

      • Chương trình Pascal

    • 3.8 Hình Vuông và Tam Giác

      • Thuật toán

      • Chương trình Pascal

    • 3.9 Chiều dài của giai thừa

      • Thuật toán

      • Chương trình C++

      • Chương trình Pascal

    • 3.10 Số ước chẵn lẻ

      • Thuật toán

      • Chương trình C++

      • Chương trình Pascal

    • 3.11 Operators (Toán tử)

      • Thuật toán

      • Chương trình C++ (Phương án 1)

      • Chương trình Pascal (Phương án 1)

      • Chương trình C++ (Phương án 2)

      • Chương trình Pascal (Phương án 2)

    • 3.12 Người thắng cử

      • Thuật toán

    • 3.13 Cặp điểm gần nhất

      • Thuật toán 1. Duyệt toàn bộ

      • Thuật toán 2: Chia để trị.

      • Chương trình C++

      • Chương trình Pascal

      • Độ phức tạp

    • 3.14 Mọi đường ngắn nhất

      • Hiểu đề bài

      • Thuật toán

      • Chương trình C++

      • Chương trình Pascal

      • Độ phức tạp tính toán

    • 3.15 Đường đi và chu trình Euler.

      • Thuật toán Hierholzer

      • Chương trình C++ (Phương án 1)

      • Chương trình Pascal (Phương án 1)

      • Dữ liệu test

      • Bình luận

    • 3.16 Du hành

      • Thuật toán

      • Chương trình C++

      • Chương trình Pascal

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan