41
I. BÀI TẬP CĂN BẢN Bài 1. Xét hai giải thuật tính gần đúng e x bằng công thức: e x = 1+x/1!+x 2 /2!+…+x n /n! (x,n cho trước). 1+2/1+4/2=4 + Giải thuật 1: Tính từng số hạng rồi cộng lại + Giải thuật 2: Dựa vào số hạng trước, tính số hạng sau 1) Trình bày các bước thực hiện giải thuật 1 và 2. 2) Đánh giá hai giải thuật Bài 2. Liệt kê tất cả các dãy nhị phân chiều dài bằng n(Bằng giải thuật sinh) Bài 3. Liệt kê các hoán vị của tập X={1,…,n} Bài 4. Liệt kê các tổ hợp chặp m của tập X={1,…,n} Bài 5. Liệt kê các chỉnh hợp không lặp chặp m của tập X={1, …,n} Bài 6. Liệt kê các chỉnh hợp lặp chặp m của tập X={1,…,n} II. BÀI TẬP MẢNG Bài 1. Tìm cách chia mảng nguyên dương n phần tử cho trước thành hai đoạn có tổng các phần tử trong mỗi đoạn bằng nhau. Bài 2. Tìm cách chia mảng nguyên dương n phần tử cho trước thành hai đoạn có tổng các phần tử trong mỗi đoạn này bằng k lần tổng các phần tử trong đoạn kia với k là số nguyên dương. Bài 3. Cho trước mảng 2 chiều A[1:n][1:n], mỗi phần tử của nó bằng 0, 1, 5 hoặc 11. Hãy tính số lượng các bộ bốn A[i,j], A[i+1,j], A[i, j+1], A[i+1, j+1] trong đó các phần tử đều khác nhau. Bài 4. Cho trước mảng 1 chiều. Chuyển các phần tử khác không về đầu dãy và các phần tử bằng không về cuối dãy mà vẫn giữ nguyên trật tự trước sau của các phần tử khác không. Không dùng 1 mảng phụ. Bài 5. Trong mảng A[1:n] (với n khá lớn) chỉ chứa các số 0, 1, 2. Hoán vị các phần tử sao cho đầu mảng chứa số 1, giữa mảng chứa số 2 và cuối mảng chứa số không. Không dùng 1 mảng phụ. Bài 6. Một mảng chứa N cặp số (ai, bi) tương ứng với N đường thẳng yi = aix + bi . Các đường thẳng được sắp xếp trong đoạn [0,1] trên trục x với ý nghĩa sau: yi < yi+1 với 1

Baitap ktlt

  • Upload
    ho-loi

  • View
    46

  • Download
    4

Embed Size (px)

Citation preview

Page 1: Baitap ktlt

I. BÀI TẬP CĂN BẢN

Bài 1. Xét hai giải thuật tính gần đúng ex bằng công thức: ex = 1+x/1!+x2/2!+…+xn/n! (x,n cho trước). 1+2/1+4/2=4

+ Giải thuật 1: Tính từng số hạng rồi cộng lại

+ Giải thuật 2: Dựa vào số hạng trước, tính số hạng sau

1) Trình bày các bước thực hiện giải thuật 1 và 2.

2) Đánh giá hai giải thuật

Bài 2. Liệt kê tất cả các dãy nhị phân chiều dài bằng n(Bằng giải thuật sinh)

Bài 3. Liệt kê các hoán vị của tập X={1,…,n}

Bài 4. Liệt kê các tổ hợp chặp m của tập X={1,…,n}

Bài 5. Liệt kê các chỉnh hợp không lặp chặp m của tập X={1,…,n}

Bài 6. Liệt kê các chỉnh hợp lặp chặp m của tập X={1,…,n}

II. BÀI TẬP MẢNG

Bài 1. Tìm cách chia mảng nguyên dương n phần tử cho trước thành hai đoạn có tổng các phần tử trong mỗi đoạn bằng nhau.

Bài 2. Tìm cách chia mảng nguyên dương n phần tử cho trước thành hai đoạn có tổng các phần tử trong mỗi đoạn này bằng k lần tổng các phần tử trong đoạn kia với k là số nguyên dương.

Bài 3. Cho trước mảng 2 chiều A[1:n][1:n], mỗi phần tử của nó bằng 0, 1, 5 hoặc 11. Hãy tính số lượng các bộ bốn A[i,j], A[i+1,j], A[i, j+1], A[i+1, j+1] trong đó các phần tử đều khác nhau.

Bài 4. Cho trước mảng 1 chiều. Chuyển các phần tử khác không về đầu dãy và các phần tử bằng không về cuối dãy mà vẫn giữ nguyên trật tự trước sau của các phần tử khác không. Không dùng 1 mảng phụ.

Bài 5. Trong mảng A[1:n] (với n khá lớn) chỉ chứa các số 0, 1, 2. Hoán vị các phần tử sao cho đầu mảng chứa số 1, giữa mảng chứa số 2 và cuối mảng chứa số không. Không dùng 1 mảng phụ.

Bài 6. Một mảng chứa N cặp số (ai, bi) tương ứng với N đường thẳng yi = aix + bi . Các đường thẳng được sắp xếp trong đoạn [0,1] trên trục x với ý nghĩa sau: yi < yi+1 với mọi giá trị i giữa 0 và N-2, và với mọi giá trị của x trên đoạn [0,1]

Trình bày thuật toán và viết chương trình con để xác định nhanh 2 đường gần nhất

“bao quanh” điểm P(xP, yP) cho trước với 0 ≤ xP ≤ 1

1

Page 2: Baitap ktlt

Bài 7. Tìm các số tự nhiên lẻ có ba chữ số. Ba chữ số này theo trận tự viết từ trái sang phải tạo thành cấp số cộng.

Bài 8. Tìm các số tự nhiên lẻ có ba chữ số. Ba chữ số này theo trận tự viết từ trái sang phải tạo thành cấp số nhân.

Bài 9. Cho trước số tự nhiên n. Tìm tất cả các ước số nguyên tố khác nhau của nó.

Bài 10. Viết chương trình liệt kê tất cả các số tự nhiên K thỏa mã đồng thời những điều kiện sau:

a. K là số có 5 chữ số.

b. K là số nguyên tố.

c. Đảo ngược các chữ số trong K ta cũng nhận được một số nguyên tố.

d. Tổng các chữ số của K cung là số nguyên tố.

Kết quả ghi vào file ketqua.out có dạng như sau: dòng đầu tiên ghi số lượng số K tìm được, các dòng tiếp theo ghi các số K, mỗi dòng 5 số.

Bài 11. Một ma trận vuông A chỉ có các phần tử thuộc đường chéo chính và hai đường chéo sát đường chéo chính là khác không (a[i,j]=0 nếu |i-j|>1). Ma trận A có dạng

X X 0 0 0X X X 0 00 X X X 00 0 X X X0 0 0 X X

Để tiết kiệm bộ nhớ ta chỉ lưu trữ các phần tử khác không bằng mảng 1 chiều. Viết hàm nhập, xuất, cộng hai ma trận dạng này.

Bài 12. Viết chương trình tìm ma trận nghịch đảo và đánh giá độ phức tạp của chương trình.

III. KỸ THUẬT ĐỆ QUY

Bài 1. Cho dãy an như sau:

a0 =1; a1=0; a2 =-1;

an = 2an-1 – 3an-2 - an-3 (n>2)

Viết chương trình tính số hạng thứ n của dãy bằng hai cách:

a) Sử dụng kỹ thuật đệ qui.

b) Không sử dụng kỹ thuật đệ qui.

Bài 2. Liệt kê tất cả các dãy nhị phân chiều dài bằng n

Bài 3. Liệt kê các hoán vị của tập X={1,…,n}

Bài 4. Liệt kê các tổ hợp chặp m của tập X={1,…,n}

Bài 5. Cho dãy gồm n số, tìm các dãy con có tổng bằng m.

Bài 6. Cho dãy gồm n số, tìm các dãy con có k phần tử và có tổng bằng m.

Bài 7. Cho dãy n số nguyên và một số k, xuất ra tất cả các dãy con giảm có k phần tử (dãy

con có thể liên tiếp hoặc không liên tiếp và có thể có phần tử trùng).

Ví dụ: dãy 5 2 4 3 1 có các dãy con 3 phần tử và giảm là: 5 2 1; 5 4 3; 5 4 1; 5 3 1; 4 3 1

2

Page 3: Baitap ktlt

IV. STACK & QUEUE

Bài 1. Viết chương trình đổi số thập phân sang cơ số b (2,8,16).

Bài 2. Viết hàm tính giá trị của biểu thức dưới dạng hậu tố chỉ bao gồm: các dấu mở ngoặc/đóng ngoặc; 4 toán tử cộng, trừ, nhân và chia (+, -, *, /); các toán hạng đều chỉ là các con số nguyên từ 0 đến 9; không có bất kỳ khoảng trắng nào giữa các ký tự.

Bài 3. Dùng dslk đơn có nút head để lưu trữ một tập hợp các số nguyên.

a) Viết hàm xét một phần tử có thuộc tập hợp hay không?

b) Viết các hàm tìm giao, hợp, hiệu hai tập hợp.

c) Viết hàm xét một tập có là một tập con của một tập cho trước hay không?

Bài 4. Tàu theo lối vào, vào xưởng sửa chữa, sửa xong ra theo lối ra. Biết rằng tàu vào sau sẽ được sửa trước.

Ví dụ: có 4 đầu tàu xếp hàng sửa chữa theo thứ tự 1,2,3,4 ; nếu thực hiện các lệnh vào/ra theo thứ tự sau: VVRVVRRR thì thứ tự lúc ra là: 2, 4,3,1.Xét 6 đầu tàu xếp hàng sửa chữa theo thứ tự 1,2,3,4,5,6. Cho biết dãy lệnh vào/ra như thế nào để có thứ tự lúc ra là:a) 3,2,5,6,4,1b) 1,5,4,6,3,2

Bài 5. Vũ trường ABC mỗi tối thứ bảy có tổ chức khiêu vũ cho các cặp nam-nữ. Cặp đầu tiên là người nam đến đầu tiên và người nữ đến đầu tiên, cặp thứ hai là người nam đến thứ hai và người nữ đến thứ hai, …. Hãy viết chương trình dùng hàng đợi, nhập những người đi dự buổi khiêu vũ (nhập tên và giới tính), sau đó xuất ra màn hình từng cặp khiêu vũ và các người còn dư.

Bài 6.

a. Dùng stack viết chương trình đổi số thập phân sang cơ số b (2,8,16).

HD:

vàora

Xưởng sửa chữa

3

132162032112101011data0123

top

Chia 13 cho 2 cho tới khi thương số bằng 0 thì ngừng.Các số dư cất vào stack, sau đó lấy ra, kết quả là:1310= 11012 .

Page 4: Baitap ktlt

b. Dùng stack viết chương trình tháp Hà Nội không đệ qui: In ra các bước dời n đĩa từ A sang B, C trung gian. Yêu cầu là mỗi lần chỉ được dời một đĩa và không được để đĩa lớn trên đĩa nhỏ.

HD: G/s dời 3 đĩa từ A sang B, C trung gian.

Thứ tự dời đĩa: A->B, A->C, B->C, A->B, C->A, C->B, A->B

B0: Cất (3,A,B,C)B1: Trong khi stack khác rỗng, lặp lại các bước sau:

B1.1: lấy dl từ stackB1.2: nếu 1 đĩa thì xuất, ngược lại cất dl theo thứ tự: phải, giữa, trái

Bài 7. Viết hàm tính chuỗi biểu thức chỉ bao gồm: các dấu mở ngoặc/đóng ngoặc; 4 toán tử cộng, trừ, nhân và chia (+, -, *, /); các toán hạng đều chỉ là các con số nguyên từ 0 đến 9; không có bất kỳ khoảng trắng nào giữa các ký tự.

HD:

 Các toán tử được đặt giữa hai toán hạng gọi là biểu thức trung tố (infix), nếu đặt sau các toán hạng gọi là biểu thức hậu tố (postfix). Biểu thức hậu tố không cần ngoặc và máy tính dễ dàng tính được giá trị của biểu thức hậu tố.

* Thuật toán tính giá trị biểu thức hậu tố:

Đọc biểu thức từ trái sang phải, nếu gặp một toán hạng (con số hoặc biến) thì push toán hạng này vào ngăn xếp; nếu gặp toán tử, lấy hai toán hạng ra khỏi ngăn xếp (stack), tính kết quả, đẩy kết quả trở lại ngăn xếp. Khi quá trình kết thúc thì con số cuối cùng còn lại trong ngăn xếp chính là giá trị của biểu thức đó.

 Ví dụ:  biểu thức trung tố :

 5 + ((1 + 2) * 4) + 3

 được biểu diễn lại dưới dạng hậu tố là (ta sẽ bàn về thuật toán chuyển đổi từ trung tố sang hậu tố sau):

 5 1 2 + 4 * + 3 +

 Quá trình tính toán sẽ diễn ra theo như bảng dưới đây:

Ký tự Thao tác Trạng thái stack

(1,A,B,C)(1,A,C,B)(2,A,C,B)(1,B,C,A)(1,C,A,B)(1,A,B,C)(1,A,B,C)(1,C,B,A)

(3,A,B,C)(2,C,B,A)(2,C,B,A)(1,A,B,C)RỖNG

4

(3,A,B,C)

(2,A,C,B) (2,C,B,A)(1,A,B,C)

(1,A,B,C) (1,A,C,B) (1,B,C,A) (1,C,A,B) (1,C,B,A) (1,A,B,C)

Page 5: Baitap ktlt

5 Push 5 51 Push 1 5, 12 Push 2 5, 1, 2+ Tính 1 + 2

Push 35, 3

4 Push 4 5, 3, 4* Tính 3 * 4

Push 125, 12

+ Tính 12 + 5 Push 17

17

3 Push 3 17, 3+ Tính 17 + 3

Push 2020

* Thuật toán chuyển đổi biểu thức trung tố sang hậu tố

Duyệt biểu thức từ trái sang phải:

+ Nếu gặp một toán hạng (con số hoặc biến) thì ghi nó vào chuỗi kết quả (chuỗi kết quả là biểu thức hậu tố).

+ Nếu gặp dấu mở ngoặc, đưa nó vào stack.

+  Nếu gặp một toán tử (gọi là o1 ), thực hiện hai bước sau:

- Chừng nào còn có một toán tử o2 ở đỉnh ngăn xếp và độ ưu tiên của o1 nhỏ hơn hay bằng độ ưu tiên của o2 thì lấy o2 ra khỏi ngăn xếp và ghi vào kết quả (ngoặc trái có độ ưu tiên thấp nhất).

-  Push o1 vào ngăn xếp

+ Nếu gặp dấu đóng ngoặc thì cứ lấy các toán tử trong ngăn xếp ra và ghi vào kết quả cho đến khi lấy được dấu mở ngoặc ra khỏi ngăn xếp.

+ Khi đã duyệt hết biểu thức trung tố, lần lượt lấy tất cả toán hạng (nếu có) từ ngăn xếp ra và ghi vào chuỗi kết quả.

ví dụ :  Biểu thức cần chuyển đổi: 3+4*2/(1-5)

Ký tự Thao tác Stack Chuỗi hậu tố3 Ghi 3 vào k.quả   3+ Push + +  4 Ghi 4 vào k.quả   3 4* Push * + *  2 Ghi 2 vào kquả   3 4 2/ Lấy * ra khỏi stack, ghi vào k.quả, push

/+  / 3 4 2 *

( Push ( + / ( 3 4 2 *1 Ghi 1 vào k.quả + / ( 3 4 2 * 1- Push - + / ( - 3 4 2 * 15 Ghi 5 vào k.quả + / ( - 3 4 2 * 1 5) Pop cho đến khi lấy được (, ghi các

toán tử pop được ra k.quả + / 3 4 2 * 1 5 -

  Pop tất cả các toán tử ra khỏi ngăn xếp   3 4 2 * 1 5 – / +

5

Page 6: Baitap ktlt

và ghi vào kết quả

Thuật toán được trình bày ở đây là khá đơn giản và chưa ứng dụng được trong trường hợp biểu thức có các hàm như sin, cos,… hoặc có các biến. Tuy nhiên, việc mở rộng thuật toán là hoàn toàn có thể.

Bài 8. G/s chương trình cần sử dụng nhiều stack, nếu sử dụng nhiều cấu trúc stack riêng lẻ thì sẽ không tận dụng được bộ nhớ của nhau. Ví dụ stack 1 còn nhiều bộ nhớ, stack 2 hết bộ nhớ, nhưng lại không thể sử dụng bộ nhớ của stack 1. Để giải quyết vấn đề, hãy xây dựng các cấu trúc sau:

a) Xây dựng cấu trúc có 2 stack và các phép toán cơ bản trên cấu trúc này

b) Xây dựng cấu trúc có n stack và các phép toán cơ bản trên cấu trúc này

HD:

a) 2 stack: Để hai stack ở hai đầu, hướng phát triển ngược nhau, đáy stack cố định

b) n stack (n>2): ban đầu chia đều bộ nhớ cho n stack. Nếu có một stack hết chỗ thì đẩy stack sau sang phải hoặc dời chính stack đó sang trái, khi đó đáy stack di chuyển.

V. DANH SÁCH LIÊN KẾT

Bài 1. Viết chương trình tạo một menu thực hiện các công việc sau:

a. Nhập danh sách liên kết theo giải thuật thêm về cuối danh sách, mỗi phần tử gồm có các thông tin sau: mã sinh viên(int), và họ tên sinh viên (char[30])

b. Liệt kê danh sách ra màn hìnhc. Cho biết tổng số nút trong danh sách liên kết.d. Thêm 1 phần tử vào sau phần tử có thứ tự thứ i trong danh sách.e. In ra họ tên của sinh viên có mã do ta nhập vào.f. Loại bỏ nút có mã do ta nhập vào, trước khi xóa hỏi lại "Bạn có muốn xóa (Y/N)?"g. Sắp xếp lại danh sách theo thứ tự mã số giảm dầnh. Ghi toàn bộ danh sách vào file tên "DSSV.DAT"i. Nạp danh sách từ file "DSSV.DAT" vào danh sách liên kết. Nếu trong danh sách liên kết

đã có nút thì xóa tất cả dữ liệu hiện có trong danh sách liên kết trước khi đưa dữ liệu từ file vào.

Bài 2. Viết chương trình tạo một danh sách liên kết theo giải thuật thêm vào đầu danh sách, mỗi nút chứa một số nguyên.

Bài 3. Viết hàm xóa một nút có địa chỉ p.

Bài 4. Viết hàm copy_list trên danh sách liên kết để tạo ra một danh sách liên kết mới gống danh sách liên kết cũ.

Bài 5. Ghép một danh sách liên kết có địa chỉ đầu là First vào một danh sách liên kết có địa chỉ đầu là First1 ngay sau phần tử thứ I trong danh sách liên kết first1.

31597826

đáy stack 1 đỉnh stack 1 đỉnh stack 2 đáy stack 2

428317596

đáy stack 1 đỉnh stack 1 đáy stack 2 đỉnh stack 2 đáy stack 3 đỉnh stack 3

6

Page 7: Baitap ktlt

Bài 6. Viết hàm lọc danh sách liên kết để tránh trường hợp các nút trong danh sách liên kết bị trùng info

Bài 7. Đảo ngược vùng liên kết của một danh sách liên kết sao cho:

- First sẽ chỉ đến phần tử cuối

- Phần tử đầu có liên kết là NULL

Bài 8. Viết hàm Left_Traverse(NODE first) để duyện ngược danh sách liên kết.

Bài 9. Viết giải thuật tách một danh sách liên kết thành hai danh sách liên kết, trong đó một danh sách liên kết của phần tử có số thứ tự lẽ và một danh sách liên kết chứa các phần tử có số thứ tự chẵn trong danh sách liên kết cũ.

Bài 10. Tạo một danh sách liên kết chứa tên học viên, điểm trung bình, hạng của học viên (với điều kiện chỉ nhập tên và điểm trung bình). Quá trình nhập sẽ dừng lại khi tên nhập vào là rỗng.Xếp hạng cho các học viên. In ra danh sách học viên thứ tự hạng tăng dần(Ghi chú: Cùng điểm trung bình thì cùng hạng).

Bài 11. Nhập hai đa thức theo danh sách liên kết. In ra tích của hai đa thức này.Ví dụ: Đa thức First1: 2x5+4x2-1

Đa thức First1: 10x7-3x4+3x2

Kết quả in ra là 20x12+34x9-8x7-12x6+7x4-x2

Bài 12. Viết giải thuật thêm phần tử có nội dung x vào danh sách liên kết có thứ tự tăng dần sao cho sau khi them danh sách liên kết vẫn có thứ tự tăng dần.

Bài 13. Cài đặt cấu trúc dslk đơn có nút head và các hàm xử lý cơ bản

Bài 14. Cài đặt cấu trúc dslk đơn có vòng và các hàm xử lý cơ bản

Bài 15. Cài đặt cấu trúc dslk đơn có nút head+vòng và các hàm xử lý cơ bản

Bài 16. Cài đặt cấu trúc stack bằng dslk đơn và các hàm xử lý cơ bản trên satck

Bài 17. Cài đặt cấu trúc queue bằng dslk đơn và các hàm xử lý cơ bản trên queue.

Bài 18. Dùng dslk đơn lưu trữ đa thức P(x) = anxn + an-1xn-1 + …+ a1x1 + a0x0 . Biết rằng mỗi nút chứa dữ liệu là hệ số và số mũ của một số hạng.

a) Viết hàm tính giá trị đa thức khi biết x.

b) Viết hàm cộng, trừ, nhân, chia hai đa thức.

c) Viết hàm tính đạo hàm, tích phân một đa thức.

Hướng dẫn:

P(x)= 2x3 –x2 +5

23 -12 50P

NULL

12 51 -40Q

NULL

23 51 10R

NULL

p

r

q

7

Page 8: Baitap ktlt

Q(x)= x2 +5x-4

R(x)=P(x)+Q(x)=2x3+5x+1

+ Sắp xếp dslk P, Q theo số mũ giảm dần

+ Cộng dồn những nút có cùng số mũ trên P (Q), bỏ những nút có hệ số = 0

+ Dùng 2 biến p,q trỏ tới nút đang xét trên P,Q và biến r trỏ tới nút cuối của R.

Khởi đầu p=P, q=Q, R = r = NULL

- Nếu mũ p> mũ q thì chép nút p vào R, tăng p, tăng r

- Nếu mũ p< mũ q thì chép nút q vào R, tăng q, tăng r

- Nếu mũ p= mũ q thì cộng hs p và hs q. Nếu tổng khác 0 thì tạo nút tổng gắn vào R, tăng p,q, r. tổng bằng =0 thì chỉ tăng p,q.

Lặp lại việc so sánh số mũ, cho tới khi p=NULL hoặc q=NULL. Sau đó chép các nút còn lại của P hoặc Q vào R

Bài 19. Dùng dslk đơn có nút head để lưu trữ một tập hợp các số nguyên.

a) Viết hàm xét một phần tử có thuộc tập hợp hay không?

b) Viết các hàm tìm giao, hợp, hiệu hai tập hợp.

c) Viết hàm xét một tập có là một tập con của một tập cho trước hay không?

HD:

A={2,5}lưu trữ dạng sau:

Bài 20. Có thể dùng một mảng để cài đặt nhiều cấu trúc danh sách liên kết: Mỗi phần tử của mảng là một nút gồm hai thành phần (data,next), next là chỉ số của phần tử tiếp theo, nếu next=-1 thì đó là phần tử cuối của một ds. Hãy cài đặt các phép toán cơ bản trên dslk loại này.

Ví dụ: giả sử dùng mảng 10 phần tử và có 3 ds: list 1, list 2, và ds các nút trống (empty)

2 5ANULL

HEAD

list2 list1

012345678942-1956788-12912-141

empty

67list2=3

12 95

3 7 28-1

5

29list1=6

41 2-1

6 9 1

4empty=0

8 -1

0 4 8

8

Page 9: Baitap ktlt

Bài 21. Ban đầu ds empty là 10 nút, nút đầu là nút 0, nút kế là nút 1,…, nút cuối là nút 9. Nút được chọn để cấp phát là nút đầu ds empty, khi hủy một nút thì thêm nút đó vào đầu ds empty.

Bài 22. Viết chương trình chọn phò mã theo giải thuật Josephus: Cho n hoàng tử xếp hàng ngang, đánh số các hoàng tử từ 1->n, loại hoàng tử cách hoàng tử đầu hàng k vị trí (k là một số ngẫu nhiên được chọn trước), nếu k lớn hơn số hoàng tử còn lại thì đếm vòng lên đầu. Lặp lại việc loại cho đến khi chỉ còn 1 hoàng tử và đó là phò mã.

Hướng dẫn:

Dùng dslk vòng, hủy phần tử thứ k, cho đến khi ds chỉ còn 1 phần tử.

Ví dụ: có 5 hoàng tử, k=3

xếp hàng và đánh số: 1 2 3 4 5

loại 4: 1 2 3 5

loai 5: 1 2 3

loại 1: 2 3

loại 3: 2

2 là phò mã

Bài 23. Viết chương trình tự điển Anh-Việt có các chức năng sau:

a) Nhập, xem, xoá, sửa từ

b) Tra từ: nhập tiếng Anh hiện nghĩa tiếng Việt.

c) Hiện toàn bộ tự điển theo thứ tự Alphabet

Yêu cầu là tự điển lưu trữ theo cấu trúc sau:

Hướng dẫn:

Tự điển lưu trữ bằng 26 dslk đơn, dslk thứ 0 lưu trữ vần a,…, slk thứ 25 lưu trữ vần z. Mỗi ds luôn có thứ tự theo Alphabet.

Bài 24. Xét ma trận thưa, trong ma trận chỉ có một số ít phần tử khác không. Để tiết kiệm bộ nhớ khi lưu trữ ma trận này, ta có thể tổ chức như sau:

0 1 2 3 40 0 0 0 5 91 0 0 0 0 02 0 0 8 0 03 0 0 0 0 04 0 2 0 4 0

Dslk thứ 0 có phần tử (3,5) nghĩa là: hàng 0, cột 3 có số 5

Viết hàm cộng, trừ, nhân hai ma trận theo cách lưu trữ này.

012…25 amột andvà

beecon ong bookquyển sách

zoosở thú

01234 3,5 4,9

2,8

1,2 3,4

9

Page 10: Baitap ktlt

Bài 25. Viết chương trình quản lý, điều hành tuyến xa lửa, dùng dslk kép+head+vòng.

Chương trình có các chức năng sau:

a) Thêm, xem, hiệu chỉnh, hủy một đoạn đường sắt. Đoạn đường sắt có thông tin là: ga đầu, ga cuối, chiều dài đoạn đường, thời gian xe lửa chạy trên đoạn đường đó.

b) Xem toàn tuyến đường sắt đi xuôi, tuyến đường sắt đi ngược. Tuyến đường sắt gồm nhiều đoạn đường sắt.

c) Xem một lộ trình: nhập nơi đi, nơi đến, cho biết các ga trung gian, tổng chiều dài, tổng thời gian của lộ trình.

Bài 26. Viết hàm cộng, trừ, nhân, chia hai số nguyên lớn bất kỳ theo cách lưu trữ sau: ví dụ

A = 8.041.009.000.105

chia thành 5 nhóm, mỗi nhóm 3 chữ số, lưu trữ vào một nút của dslk kép+head+vòng

Bài 27. Viết chương trình xử lý đơn khiếu nại. Đơn khiếu nại nào có độ ưu tiên cao hơn sẽ được giải quyết trước. Nếu các đơn có độ ưu tiên bằng nhau thì đơn nào đến trước sẽ được giải quyết trước. Chương trình có các chức năng sau:

a. Nhận đơn: nhập tên đơn, độ ưu tiên, thông báo nếu đầy đơn (không nhận đơn nữa).

b. Giải quyết đơn: in ra màn hình tên đơn phải giải quyết, thông báo nếu hết đơn.

c. Xem các đơn: in ra màn hình các đơn cần xử lý theo thứ tự ưu tiên.

Bài 28. Trong dslk đơn chuẩn

a) Viết hàm chèn vào trước một nút khác (chèn dữ liệu x vào trước nút có đ/c là q)

b) Viết hàm hủy nút p.

c) Viết hàm hủy những nút trùng dữ liệu (nhưng nút trùng dữ liệu chỉ giữ lại một nút)

HD: a) chèn sau rồi hoán vị. b) hoán vị p và nút sau p, sau đó hủy sau p.

Bài 29. Trong dslk đơn chuẩn

a) Viết hàm tìm địa chỉ của nút thứ i trong ds (i=0,1,…)

b) Viết hàm tìm vị trí của nút có đ/c biết trước trong ds (vị trí tính từ 0)

c) Viết hàm tìm đ/c của nút ngay trước nút p

d) Viết hàm đếm số nút trong ds

VI. CÂY NHỊ PHÂN

Bài 1. Cây nhị phân cân bằng hoàn toàn là cây nhị phân mà tương ứng với tất cả các nút thì số nút của cây con bên trái và số nút của cây con bên phải chênh lệch nhau không quá 1. Cho cây nhị phân tìm kiếm có con trỏ đầu tree chỉ đến gốc của cây với khai báo như sau:

struct node {

int key;

int info ;

struct node *left;

head 8 41 9A 0 105

10

Page 11: Baitap ktlt

struct node *right;

} ;

typedef struct node *PTR;

PTR tree;

a. Hãy viết chương trình con xác định xem cây nhị phân tree có phải là cây nhị phân tìm

kiếm cân bằng hoàn toàn hay không?

b. Hãy viết hàm trả về mức của nút có khóa key = X, với X là số nguyên dương và giả sử

rằng nút gốc có mức bằng 1. Ghi chú là trong trường hợp cây tree không có nút với

khóa X thì hàm sẽ trả về 0.

Bài 2. Trên cây nhị phân tìm kiếm (BST) với dữ liệu ở các nút là số nguyên, hãy viết các hàm sau:

a) Đếm số nút và số nút lá trên cây.

b) Tìm so lớn nhất, so nho nhat trên cây, tính giá trị trung bình của các so trên cây.

c) Tính chiều cao của cây.

d) Kiểm tra cây nhị phân có phải cây AVL không?

Bài 3. Viết chương trình tạo một menu thực hiện các mục sau:

a. Tạo cây nhị phân tìm kiếm với nội dung là số nguyên(không trùng nhau)

b. Liệt kê cây nhị phân ra màn hình theo thứ tự NLR

c. Đếm tổng số nút, số nút lá, và số nút trung gian của cây.

d. Tính độ cao của cây.

e. Loại bỏ nút có nội dung là x trong cây nhị phân BST.

f. Thêm nút có nội dung x vào cây nhị phân BST sao cho sau khi thêm thì cây vẫn là BST.

g. Vẽ cây nhị phân ra màn hình.

Bài 4. Cho một cây nhị phân tree, hãy viết chương trình để sao chép nó thành cây mới tree2, với khóa, nội dung, và liên kết giống như cây tree.

Bài 5. Viết các hàm kiểm tra xem cây nhị phân

a. Có phải là cây nhị phân đúng không.

b. Có phải là cây nhị phân đầy không.

Bài 6. Viết hàm kiểm tra nút x và y có trên cây hay không, nếu có cả x và y trên cây thì xác định nút gốc của cây con nhỏ nhất có chứa x và y.

Bài 7. Hãy trình bày cách chuyển một biểu thức số học sang cây biểu thức. Vẽ cây biểu thức của biểu thức số học sau:(10+5)^2/(52*4-3)

Bài 8. Cho một cây biểu thức, hãy viết hàm Calculate(NODE root) để tính giá trị của cây biểu thức đó biết rằng các toán tử được dùng trong biểu là: + - * / ^ % !

Bài 9. Chứng minh:

11

Page 12: Baitap ktlt

a/ Nếu số nút của cây nhị phân gần đầy là lẻ thì cây này cũng là cây nhị phân đúng. Nếu số nút của cây nhị phân gần đầy là chẵn thì cây này không là cây nhị phân đúng.

b/ Nếu cây nhị phân đúng có n nút lá thì sẽ có 2n-1 nút.

c/ Nếu cây nhị phân không đúng và gần đầy có n nút lá thì sẽ có 2n nút.

Bài 10. Cài đặt các cách duyệt cây NLR, LNR, LRN không sử dụng kỹ thuật đệ qui.

HD:

* Duyệt NLR:

+ Cắt gốc vào stack

+ Trong khi stack còn khác rỗng thi thực hiện các lệnh sau:

- Lấy p ở đỉnh stack, in p->data

- Nếu p có con phải/trái thì cắt con phải/trái vào stack

* Duyệt LNR:

+ p=root

+ Trong khi p còn khác NULL thì cắt p vào stack và gán p=p->left

+ Trong khi stack còn khác rỗng thực hiện các lệnh sau:

- lay p tu dinh stack, in p->data,

- neu p co con phai thi goi q la con phai va trong khi q con khac NULL thi cat q vao stack va gan q=q->left

* Duyet LRN:

5520 32 6535 35 35* 60*30* 30* 30* 8070 70 70 70*50* 50* 50* 50*20,32,35,30,55,65,60,80,70,50(co dau * la flag=1)

// mot nut khi cat cac nut con vao stack thi gan flag=1 de tb cac con trai/phai cua no da duoc duyet

+ ban dau gan tat cac nut co flag=0,

203255303035606550505070708020,30,32,35,50,55,60,65,70,80

50

30 70

60 80

55 65

35

32

20

12

Page 13: Baitap ktlt

+ cat root vao stack

+ trong khi stack con khac rong thuc hien cac buoc sau :

- goi p la phan tu dinh stack

- neu p khong co con hoac co cua p=1 thi lay p ra khoi stack, xuat p->data

nguoc lai cat con phai va/hoac con trai neu co cua p vao stack va gan co cua p=1

Bài 11. Cây nhị phân đầy hoặc gần đầy có thể cài đặt bằng mảng: mỗi nút là một phần tử của mảng, nút gốc lưu ở phần tử 0 của mảng, nếu nút cha lưu ở phần tử thứ i của mảng thì nút con bên trái lưu ở phần tử 2i+1 và nút con bên phải lưu ở phần tử 2i+2. Với cây nhị phân bất kỳ, có thể thêm vào các nút gỉa để chuyển về cây gần đầy (nút gỉa có thể gây lãng phí bộ nhớ). Hãy viết các hàm cơ bản trên cấu trúc cây cài đặt bằng mảng như trên.

Hướng dẫn:

0 1 2 3 4 5 6 7 8 9 10 11 12 13 1450 30 70 60 80 55 65

Bài 12. Cài đặt cây cân bằng AVL (Adelson Velski &Landis) với các hàm cơ bản

Bài 13. Viết hàm tạo cây, duyệt cây nhị phân tìm kiếm theo chiều rộng

HD:

Cây nhị phân tìm kiếm là cây mà mỗi nút có tối đa hai con, trong đó con trái nhỏ hơn nút,s con phải lớn hơn nút.

- Khai báo cấu trúc một nút

struct node

{ int data;

node * left,*right;

};

node *root;//dc goc cay

- Nhập cây: nút nhỏ bên trái, nút lớn bên phải

- In Cây: dùng queue

B1: cất root vào queue

B2: trong khi queue còn khác rỗng thực hiện các bước sau:

50

30 70

604020 80

0

1 2

3 4 5 6

50

30 70

60 80

55 65

50

30 70

60 80

0

1 2

3 4 5 6

55 657 8 9 10 11 12

13

0 1 2 3 4 5 650 30 70 20 40 60 80

Page 14: Baitap ktlt

B2.1: Lấy node trong queue và in data của node

B2.2: Cất con trái, con phải nếu có của node vào queue

- Cất 5- Lấy 5, in 5- Cất con của 5 là 2, 9 vào queue- Lấy 2, in 2- Cất con của 2 là 1, 3 vào queue- Lấy 9, in 9- Cất con của 9 là 6, 12 vào queue- Lấy 1, in 1, 1 không có con nên không cất con của 1- vv…

Bài 14. Trên cây nhị phân tìm kiếm (BST) với dữ liệu ở các nút là số nguyên, hãy viết các hàm sau:

a) Đếm số nút và số nút lá trên cây.

b) Tìm so lớn nhất, so nho nhat trên cây, tính giá trị trung bình của các so trên cây.

c) Tính chiều cao của cây.

d) Duyệt cây theo mức từ mức thấp đến mức cao, mỗi mức duyệt từ trái qua phải.

e) In cây ở dạng hình cây.

f) Xoay cây: tại mỗi nút có cây con trái thành cây con phải và ngược lại

VII. ĐỒ THỊ

Bài 1. Cho đồ thị vô hướng được lưu trữ trong file văn bản dothi.in theo khuôn dạng sau:

- Dòng đầu tiên ghi số đỉnh của đồ thị

- Mỗi dòng kế tiếp ghi hai đỉnh của một cạnh đồ thị, hai đỉnh được ghi cách nhau một hoặc vài ký tự trống.

Viết chương trình kiểm tra tính liên thông của đồ thị, kết quả được ghi trong file văn bản ketqua.out theo khuôn dạng như sau:

- Dòng thứ nhất ghi : đồ thị liên thông hoặc đồ thị không liên thông

- Nếu đồ thị không liên thông thì mỗi dòng tiếp theo ghi các đỉnh của một thành phần liên thông.

Bài 2. Cho đồ thị vô hướng G có n đỉnh với các đỉnh được đánh số từ 1 đến n theo cấu trúc ma trận kề sau đây:

const MAX = 50; // Số đỉnh tối đa của đồ thị

typedef int Dothi[MAX][MAX] ;

Dothi G ;

0123456752991313612361261212Kết quả in ra: 5, 2, 9, 1, 3, 6, 12

14

Page 15: Baitap ktlt

int n; // số đỉnh của đồ thị G

Hãy viết chương trình con để xác định đồ thị G có đường đi từ đỉnh u đến đỉnh v hay không?

Bài 3. Cho đồ thị vô hướng G được biểu diễn dưới dạng danh sách kề trong file dske.in theo khuôn dạng:

• Dòng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị.

• N dòng kế tiếp mỗi dòng ghi lại danh sách kề của đỉnh tương ứng, hai đỉnh trong cùng một danh sách kề được ghi cách nhau một hoặc vài kí tự trống, đỉnh không có cạnh nối với nó (đỉnh cô lập) được ghi giá trị 0 hoặc là dòng trống.

Hãy viết chương trình thực hiện việc kiểm tra và đưa ra thông báo tính liên thông của G như sau. Nếu G không liên thông thì thông báo ”G không liên thông”. Nếu G liên thông thì kiểm tra tiếp xem G có chu trình Euler hay không, nếu có thì thông báo “G là đồ thị Euler”. Nếu G không có chu trình Euler thì kiểm tra tiếp xem G có đường đi Euler hay không, nếu có thì thông báo “G là đồ thị nửa Euler”, ngược lại thông báo “G không là đồ thị nửa-Euler”. Ví dụ với đồ thị 4 đỉnh được cho trong file dske.in dưới đây sẽ cho ta kết quả “G là đồ thị Euler”.

dske.in

4

2 3

1 4

1 4

3 2

Bài 4. Cho đồ thị vô hướng G =<V,E> gồm N đỉnh và M cạnh được biểu diễn dưới dạng danh sách kề trong file dske.in theo khuôn dạng sau:

Dòng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị;

N dòng kế tiếp, mỗi dòng thứ i (i=1,…,N) ghi lại danh sách các đỉnh kề với đỉnh thứ i. Hai đỉnh trong cùng một danh sách kề được phân biệt với nhau bằng một hoặc vài kí tự trống. Dòng thứ i sẽ ghi số 0 nếu đỉnh i không có đỉnh kề.

Hãy viết chương trình chuyển đổi biểu diễn đồ thị G dưới dạng danh sách kề như trên thành biểu diễn của đồ thị G dưới dạng ma trận kề và danh sách cạnh. Khuôn dạng biểu diễn đồ thị G dưới dạng ma trận kề, danh sách kề được ghi lại trong file mtke.out và dscanh.out theo khuôn dạng sau:

+ Khuôn dạng file mtke.out:

Dòng đầu tiên ghi lại số tự nhiên N là số đỉnh của đồ thị;

N dòng kế tiếp ghi lại ma trận kề của đồ thị, hai phần tử khác nhau của ma trận kề được ghi cách nhau bởi một vài ký tự trống.

+ Khuôn dạng file dscanh.out:

Dòng đầu tiên ghi lại số tự nhiên N và M tương ứng với số đỉnh và số cạnh của đồ thị, hai số được ghi cách nhau bởi một vài ký tự trống;

M dòng kế tiếp mỗi dòng ghi lại một cạnh của đồ thị, đỉnh đầu và đỉnh cuối của mỗi cạnh được ghi cách nhau bởi một vài ký tự trống.

15

Page 16: Baitap ktlt

Ví dụ đồ thị gồm 5 đỉnh, 5 cạnh được biểu diễn trong file dske.in như dưới đây sẽ cho ta các file mtke.out và dscanh.out tương ứng.

dske.in mtke.outdscanh.out

5 5 54

2 3 0 1 1 0 0 12

1 4 1 0 0 1 0 13

1 5 1 0 0 0 1 24

2 0 1 0 0 0 35

3 0 0 1 0 0

Chú ý: làm bài tập tương tự cho đồ thị có hướng.

Bài 5. Cho đồ thị có hướng được lưu trữ trong file văn bản duongdi.in theo khuôn dạng sau:

- Dòng đầu tiên ghi số đỉnh và đỉnh xuất phát s.

- Mỗi dòng kế tiếp ghi đỉnh đầu, đỉnh cuối và trọng số của một cung.

Viết chương trình tìm đuờng đi ngắn nhất từ đỉnh s đến tất cả các đỉnh còn lại, kết quả được ghi trong file văn bản duongdi.out, mỗi dòng ghi một đường đi.

ví dụ:

file duongdi.in

6 11 2 12 3 52 4 22 6 73 6 14 3 14 1 24 5 45 4 36 5 1

file duongdi.out

Duong di tu 1 den 2 la:1->2

Duong di tu 1 den 3 la:1->2->4->3

Duong di tu 1 den 4 la:1->2->4

Duong di tu 1 den 5 la:1->2->4->3->6->5

Duong di tu 1 den 6 la:1->2->4->3->6

VIII.SẮP XẾP VÀ TÌM KIẾM

16

Page 17: Baitap ktlt

IX. MỘT SỐ BÀI TOÁN CĂN BẢN

Bài 1. Giả sử bảng điểm có dạng sau.

Mã sinh viên Môn 1 Môn 2 Môn 3

sv1 6 9 7

sv2 5 2 8

vv…

1/ Hãy xây dựng giải thuật nhập điểm của n sinh viên và giải thuật in bảng điểm trong hai trường hợp sau:

a) Dùng CTDL để lưu trữ bảng điểm là mảng 1 chiều: điểm của sv1 lưu vào 3 vị trí đầu mảng, 3 vị trí tiếp theo lưu điểm của sv2, vv…

b) Dùng CTDL để lưu trữ bảng điểm là mảng 2 chiều (n hàng, 3 cột): hàng i lưu điểm sv thứ i, cột j lưu điểm môn j.

2/ Cho nhận xét về hai CTDL trên

Bài 2. Xây dựng giải thuật và đánh giá giải thuật đoán số như sau: người sử dụng nghĩ một số từ 1 đến 100, máy sẽ đoán tối đa 7 lần sẽ đoán trúng.

Bài 3. Xét hệ phương trình tuyến tính có dạng

a11x1 = b1

a21x1 + a22x2 = b2

an1xn + an2x2 +…+ annxn = bn

(aij khac 0)

Để tiết kiệm bộ nhớ ta chỉ lưu trữ các hệ số của ma trận bằng mảng 1 chiều. Viết chương trình giải hệ phương trình này với cách lưu trữ như trên.

Bài 4. Xét đa thức p(x)= anxn + an-1xn-1 +…+ a0.

1/ Nếu lưu trữ đa thức bằng một mảng một chiều theo dạng (n, an, an-1,…, a0) thì có ưu nhược điểm gì?

2/ Hãy đề xuất một cách lưu trữ khác mà theo bạn là tốt hơn.

3/ Viết chương trình cộng, trừ, nhân, chia hai đa thức với cách lưu trữ như câu 2.

Bài 5. Viết chương trình giải hệ phương trình tuyến tính (n phương trình, n ẩn số) và đánh giá độ phức tạp của chương trình.

Bài 6. Cho dãy an như sau:

a0 =1; a1=0; a2 =-1;

an = 2an-1 – 3an-2 - an-3 (n>2)

Viết chương trình tính số hạng thứ n của dãy bằng hai cách:

a) Sử dụng kỹ thuật đệ qui.

b) Không sử dụng kỹ thuật đệ qui.

17

Page 18: Baitap ktlt

Bài 7. Liệt kê các cách xếp n con hậu vào bàn cờ kích thứơc n x n sao cho không ăn lẫn nhau.

Bài 8. Cho dãy gồm n số, tìm các dãy con có tổng bằng m.

Bài 9. Cho dãy gồm n số, tìm các dãy con có k phần tử và có tổng bằng m.

Bài 10. Tam giác thần bí bậc n là tam giác vuông cân, mỗi cạnh có n phần tử là các số tự nhiên từ 1 đến 3n-3 và không trùng nhau, thoả tính chất  tổng các phần tử trên mỗi cạnh đều có cùng giá trị .

ví dụ :đây là một tam giác thần bí bậc n=5 vì có tổng các phần tử trên mỗi cạnh bằng nhau (bằng 35).

12

11 2

6 4

1 7

5 9 8 3 10

a) Viết hàm kiểm tra một tam giác vuông cân với các phần tử là các số tự nhiên từ 1 đến 3n-3 có là tam giác thần bí bậc n hay không? nếu là tam giác thần bí trả về 1 ngược lại trả về 0. Biết rằng để tiết kiệm bộ nhớ, tam gíac được lưu trong mảng 1 chiều. Ví dụ tam gíac như trên lưu trữ như sau: 12 11 6 1 5 9 8 3 10 7 4 2

b) Viết hàm liệt kê tất cả các tam giác thần bí bậc n.

Bài 11. Hình vuông thần bí bậc n là một ma trận kích thước n x n, gồm các phần tử từ 1 đến n2 không trùng nhau, sao cho tổng mỗi dòng, mỗi cột, mỗi đường chéo đều bằng nhau. Ví dụ một hình vuông thần bí bậc 3 là:

2 7 6

9 5 1

4 3 8

Viết chương trình liệt kê tất cả các hình vuông thần bí bậc n.

Bài 12. Liệt kê tất cả các cách ghi N thành tổng các số nguyên dương. Ví dụ N=5, tách N thành 1 số, 2 số, 3 số, 4 số, 5 số như sau: 5, 1+4, 2+3, 1+1+3, 1+2+2, 1+1+1+2, 1+1+1+1+1

Bài 13. Cho dãy n số nguyên và một số k, xuất ra tất cả các dãy con giảm có k phần tử (dãy con có thể liên tiếp hoặc không liên tiếp và có thể có phần tử trùng).

Ví dụ: dãy 5 2 4 3 1 có các dãy con 3 phần tử và giảm là: 5 2 1; 5 4 3; 5 4 1; 5 3 1; 4 3 1

Bài 14. Cho dãy n số nguyên, xuất ra dãy con tăng dài nhất (dãy con có thể liên tiếp hoặc không liên tiếp và có thể có phần tử trùng). Nếu có nhiều dãy con tăng dài bằng nhau thì chỉ xuất ra một dãy.

Ví dụ: dãy 7, 3, 2, 4, 1, 6, 5, 8 có dãy con tăng dài nhất là: 3, 4, 6, 8 có chiều dài là 4

Bài 15. Tìm tất cả các nghiệm nguyên không âm của phương trình sau:

a1x1 +a2x2 +…anxn = b (ai duong, bi la các số nguyên không âm)

Ví dụ:

phương trình: x1+2x2+3x3=20 (n=3,b=20, a1=1, a2=2, a3=3)

18

Page 19: Baitap ktlt

có 44 nghiệm là: x=(0,1,6),.., x=(2,2,4),...,x=(20,0,0)

X. BÀI TẬP CÓ BÀI GIẢI

Bài 1. Chứng tỏ rằng chương trình sử dụng các lệnh if, if..else, switch, for, while, do.. while đều có thể chuyển đổi thành chương trình chỉ sử dụng lệnh while.

Bài 2. Hãy chuyển đổi chương trình sau đây thành chương trình chỉ sử dụng lệnh while và hãy cho biết kết quả sau khi chương trình thực hiện:#include <stdio.h>

#include <conio.h>

#include <string.h>

void main(void)

{

clrscr();

int n, m=0, k=0;n = strlen(str);char s[32];

for(int i=0; i<=n; i++){

switch(str[i]){

case ' ' :

case '\t':

case '\n':

case '\r':

case '\0':

if (k>0) {

s[k]='\0';m++;k=0;

printf("\n Kết quả bước %d:%s",m,s);

}

break;

default:

s[k++]=str[i]; break;

}

}

}

Bài giải: 3

Bài 3. Viết chương trình tìm giá trị tối ưu fopt = f(x1,x2,..,xn) và phương án tối ưu xopt =

(x1, x2,..,xn) của hàm mục tiêu Trong đó

; cj, aj, b là các số nguyên dương

(j=1,2,..,n).

Dữ liệu vào n, b, cj, aj được cho trong file Data.in theo khuôn dạng sau:

Dòng đầu tiên ghi lại hai số tự nhiên n và b, hai số được viết cách nhau bởi một hoặc vài kí tự trống.

19

Page 20: Baitap ktlt

Dòng kế tiếp ghi lại n số nguyên dương c1, c2, .., cn. ; các số được viết cách nhau bởi một hoặc vài kí tự trống.

Dòng cuối cùng ghi lại n số nguyên dương a1, a2,..,an; các số được viết cách nhau bởi một hoặc vài kí tự trống.

Giá trị tối ưu và phương án tối ưu tìm được ghi lại trong file Ketqua.out theo khuôn dạng sau:

Dòng đầu tiên ghi lại giá trị tối ưu fopt = f(x1,x2,..,xn) của hàm mục tiêu.

Dòng kế tiếp ghi lại n thành phần của phương án tối ưu xopt = (x1, x2,..,xn). Mỗi thành phần được viết cách nhau một vài kí tự trống.

Ví dụ dưới đây sẽ minh họa cho file Data.in và file Ketqua.out của bài toán

Data.inKetqua.out

4 814

8 5 3 11 1 0 1

4 3 2 1

Bài giải: 3

Bài 4. Viết chương trình giải ô số sudoku.

Cho bảng 9x9, chia làm 9 khối kích thước 3x3. Trong bảng có một số ô đã có số, hãy điền số vào các ô trống sao cho:- Mỗi khối 3x3 chỉ chứa các số từ 1 đến 9 và không trùng nhau.- Mỗi hàng và mỗi cột của bảng 9x9 chỉ chứa các số từ 1 đến 9 và không trùng nhau.

Bài 5. Giống bài 4 nhưng điền số chẵn vào ô màu xanh, số lẻ vào ô màu trắng

20

Page 21: Baitap ktlt

Bài 6. Giống bài 4 nhưng thay khối 3x3 bằng đa giác.

Bài 7. Giống bài 16 nhưng thay khối 3x3 bằng đa giác có tổng cho trước

Bài 8. Viết lại hàm Bubble Sort sao cho các phần tử lớn lần lượt đưa về cuối dãy (phần tử lớn được "chìm" xuống).

Bài 9. Sử dụng cấu trúc heap, viết hàm tìm m phần tử lớn nhất trong dãy có n phần tử.

Bài 10. Cho cấu trúc heap có n phần tử, viết hàm xoá phần tử ở vị trí thứ i trên heap sao cho vẫn bảo toàn cấu trúc heap.

Bài 11. Cài đặt thuật toán Ternary Heap sort (giống thuật toán heap sort) như sau:

Một dãy có n phần tử gọi là một heap (đống) nếu ai >=max (a3i+1, a3i+2,a3i+3) với mọi i =0,…,n/3-1

Bài 12. Cho file văn bản chứa dãy số nguyên, dùng thuật toán sắp xếp ngoại (merge sort) để sắp xếp dãy số trong file.

Bài 13. Viết chương trình cộng nhẩm co10 bài, các bài sai được làm lại lần nữa theo thứ tự sai (bài sai trước làm trước).

1)1+0=2 =>Sai

2)2+1=3 =>Đúng

3)2+3=4 =>Sai

10) …

Bạn được làm các bài sai một lần nữa:

1)1+0=1 =>Đúng

3)2+3=6 =>Sai, đáp số là 5

21

Page 22: Baitap ktlt

vv…

Bạn làm sai 1 bài, được 9 điểm

HD: cất các bài sai vào queue, sau đó lấy ra cho làm lại.

Bài 14. Hãy đề nghị một cách cài đặt queue mà không cần “hy sinh” một ô trống để phân biệt trường hợp queue trống với trường hợp queue đầy, và hãy cài đặt cụ thể.

HD:

- Tạo queue rỗng: front = rear = -1

- Kiểm tra queue rỗng: front= -1

- Kiểm tra queue đầy: front=rear

- Cất dữ liệu vào queue:

rear=(rear+1)%max

nếu (front=rear) thì thông báo “đầy” và thoát

data[rear]=dl

nếu (front=-1) thì front=0

- Lấy dữ liệu từ queue:

+ nếu (front=-1) thì thông báo “rỗng” và thoát

dl=data[front]

+ nếu (front=rear) thì front=rear=-1 ngược lại front=(front+1)%max

trả về dl.

Bài 15. Hãy xây dựng cấu trúc hàng đợi có độ ưu tiên (mỗi phần tử có một giá trị gọi là độ ưu tiên, phần tử nào có độ ưu tiên cao hơn sẽ được lấy ra trước) và xây dựng các phép toán trên cấu trúc này.

HD: Cấu trúc hàng đợi: dùng mảng nhưng không cho vòng lại.

typedef int datatype; //kieu dl trong hang doi

struct pdatatype

{ datatype d; //du lieu

int p; //do uu tien

};

struct queue

{ int rear; //vi tri cat dl, front luon=0, rear la vi tri cua phan tu cuoi hang doi, rear luôn tăng

pdatatype data[maxqueue];//mang chua cac phan tu cua hang doi

};

22

(1,1,0)(3,2,3)012…

rearfront

Page 23: Baitap ktlt

Mỗi phần tử trong hàng đợi có một độ ưu tiên, khi cất dl vào hàng đợi, tìm vị trí chèn vào sao cho hàng đợi luôn là một dãy giảm theo độ ưu tiên. Phần tử được lấy ra luôn là phần tử đầu hàng đợi (phần tử thứ 0), sau đó dời các phần tử của hàng đợi qua trái một vị trí, rear=rear-1. Hàng đợi đầy khi rear=maxqueue-1 (khởi tạo ban đầu rear=-1). Hàng đợi rỗng khi rear=-1

Nhận xét: theo cách trên lấy ra dồn lại, có thể chỉ dồn khi chèn vào mà hết chỗ. Hãy so sánh và xây thêm cấu trúc theo cách này.

Bài 16. Viết chương trình tự điển Anh-Việt có các hàm sau:

a) Nhập các từ tiếng Anh và nghĩa tiếng việt, ghi vào file tudien.dat dạng nhị phân.

b) Đọc file tudien.dat vào cây BST.

c) Biết từ tiếng Anh, tìm nghĩa tiếng Việt trên cây.

d) Hủy từ tiếng Anh trên cây.

e) Biết từ tiếng Anh, cập nhật nghĩa tiếng Việt trên cây hoặc cập nhật từ tiếng Anh trên cây.

f) Nhập thêm các từ tiếng Anh và nghĩa tiếng việt chèn vào cây.

g) Ghi cây vào file tudien.dat theo thứ tự anphabet của phần tiếng Anh.

Bài 17. Làm giống bài 6 nhưng dùng file index, nghĩa là mỗi nút chỉ lưu từ tiếng Anh và số thứ tự của mẫu tin chứa từ tiếng Anh này trong file tudien.dat.

Bài 18. Số điện thọai di động của một hãng viễn thông được đánh số theo qui cách 091N.XXX.XXX, trong đó N là số nguyên từ 1 đến 4 và X là số nguyên từ 0 đến 9. Trong dịp khuyến mãi, công ty phát hành hai lọai số điện thọai có tính chất sau để thu hút khách hàng sử dụng dịch vụ:

- Số điện thọai lọai I: là những số mà sáu chữ số cuối khi đọc xuôi từ trái sang phải hay từ phải sang trái đều nhận được cùng một số có sáu chữ số. Ví dụ: sô 0913 558855

- Số điện thọai lọai II: là những số điện thọai lọai I mà tổng sáu chữ số cuối bằng 8. Ví dụ số 0913 202202.

Hãy viết chương trình ghi các số điện thọai lọai I trong file data1.out và ghi các số điện thọai lọai II trong file data2.out theo quy cách sau: dòng đầu tiên ghi số các số điện thoại lọai I hay II, các d2ng tiếp theo ghi danh sách các số tìm được, mỗi số trên một dòng.

Bài giải: 24

Bài 19. Cho đồ thị vô hướng được lưu trữ trong file văn bản dothi.in theo khuôn dạng sau:

- Dòng đầu tiên ghi số đỉnh của đồ thị

- Mỗi dòng kế tiếp ghi hai đỉnh của một cạnh đồ thị, hai đỉnh được ghi cách nhau một hoặc vài ký tự trống.

Viết chương trình kiểm tra tính liên thông của đồ thị, kết quả được ghi trong file văn bản ketqua.out theo khuôn dạng như sau:

- Dòng thứ nhất ghi : đồ thị liên thông hoặc đồ thị không liên thông

- Nếu đồ thị không liên thông thì mỗi dòng tiếp theo ghi các đỉnh của một thành phần liên thông.

Ví dụ:

file dothi.in

23

file ketqua.out

do thi khong lien thongthanh phan lien thong thu 1: 1 2 7thanh phan lien thong thu 2: 3 5thanh phan lien thong thu 3: 4 6 8

Page 24: Baitap ktlt

81 21 72 73 54 64 86 8

Bài giải 25:

Bài 20.

a) Cài đặt thuật toán Heap Sort (heap bậc 2): dãy ai gọi là heap nếu ai>=a2i ; a2i+1 với mọi i=1,2,...

b) Cài đặt thuật toán Ternary Heap sort (heap bậc 3): dãy ai gọi là heap nếu ai>=a3i-1; a3i; a3i+1 với mọi i=1,2,….

c) Cài đặt thuật toán Heap sort có heap bậc 4 như sau: dãy ai gọi là heap nếu ai>=a4i-2; a4i-1; a4i ; a4i+1 với mọi i=1,2,….

Bài giải 26

Bài 21. Cài đặt thuật tóan quick sort, không dùng kỹ thuật đệ qui, dùng stack để khử đệ qui, stack được cài đặt bằng danh sách liên kêt.

Bài giải 27

Bài 22. Cho file văn bản chứa dãy số nguyên, dùng thuật toán merge sort để sắp xếp dãy số trên file.

Bài giải 28

Bài 23. Viết chương trình quản lý điểm sinh viên có các chức năng sau:

a) Nhập bảng điểm lưu vào file sinhvien.dat dạng nhị phân, biết rằng mỗi mẫu tin trong file sinhvien.dat có cấu trúc sau: mã sinh viên, họ, tên, điểm lý thuyết, điểm thực hành, điểm trung bình.

b) Xuất file sinhvien.dat ra màn hình.

c) Dùng thuật toán sắp xếp ngoại (merge sort) để sắp xếp file sinhvien.dat trong hai trường hợp sau:

+ sắp xếp theo thứ tự điểm trung bình giảm dần.

+ sắp xếp theo tên, cùng tên sắp theo họ.

d) Dùng thuật toán tìm nhị phân để tìm sinh viên theo mã sinh viên

Bài giải 29

Bài 24. Cây khung (Prim)

Cho đồ thị vô hướng, liên thông được lưu trữ trong file văn bản caykhung.in theo khuôn dạng sau:

- Dòng đầu tiên ghi số đỉnh và đỉnh xuất phát s.

- Mỗi dòng kế tiếp ghi đỉnh đầu, đỉnh cuối và trọng số của một cạnh.

24

Page 25: Baitap ktlt

Viết chương trình tìm cây khung ngắn nhất của đồ thị, kết quả được ghi trong file văn bản caykhung.out, theo khuôn dạng sau:dòng đầu tiên ghi số cạnh và chiều dài cây khung, các dòng tiếp theo ghi các cạnh cây khung, mỗi dòng ghi một cạnh cùng trọng số của cạnh.

Ví dụ:

file caykhung.in

6 11 2 331 3 172 3 182 4 203 4 163 5 44 5 94 6 85 6 14

file caykhung.out

5 563 1 175 3 44 5 96 4 82 3 18

Bài giải 30:

Bài 25. Hãy viết chương trình liệt kê tất cả các số tự nhiên K thỏa mãn đồng thời các điều kiện (a), (b), (c) và (d) dưới đây, biết rằng P, S, B được nhập từ bàn phím:

a) K là số nguyên tố có từ a đến b chữ số. (a,b nhập từ bàn phím và 1<=a,b<=9; a<=b)

b) Các chữ số của K khác P (P = 0, 1, 2, ..,9).

c) Tổng các chữ số của K chia hết cho S.

d) Biểu diễn của K ở hệ cơ số B là một số thuận nghịch (số K được gọi là thuận nghịch nếu ta đọc từ trái sang phải hay từ phải sang trái các chữ số của K ta đều nhận được chính nó).

Bài giải 31:

Bài 26. Dãy con có tổng lớn nhất

Bạn nào có code để tìm dãy con tăng có tổng lớn nhất trong một dãy số cho trước (thực hay nguyên tùy ý)?

Bạn đưa yêu cầu chưa rõ vì nếu chỉ yêu cầu dãy con có tổng lớn nhất thì chính dãy đã cho là có tổng lớn nhất.Cũng có thể là bài toán dãy con không giảm dài nhất, bạn có nắm rõ đề bài không?

Cảm ơn anh admin, đúng là dãy con tăng có tổng lớn nhất.Ví dụ:VD: 1 2 4 5 2 3 0 1 5 8 9 12 1 0 3thì có các dãy "con tăng" là : 1 2 4 52 3

25

1

2 4

6

5 3

33

18

17

4

14

8

16

20

9

Page 26: Baitap ktlt

0 1 5 8 9 12 0 3vậy là có 4 dãy con tăng trong đó chỉ in ra dãy con tăng dài nhất là: 0 1 5 8 9 12

Bài 27. Dãy con TĂNG hay KHÔNG GIẢM?

Nếu là yêu cầu như vậy thì rất đơn giản, chi phí thuật toán là O(n) thôi.Bạn dùng 2 biến để lưu tổng giá trị lớn nhất hiện hành và chỉ số của phần tử sau cùng của dãy con đó.Bạn dùng 2 biến khác để lưu tổng giá trị và chỉ số sau cùng của dãy đang xét.Nếu kết thúc dãy đang xét thì so sánh với dãy lớn nhất hiện hành để cập nhật lại dãy lớn nhất nếu có.Chỉ cần 1 vòng lặp for là đủ.Đề bài phát biểu là dãy con tăng chứ không phải dãy con tăng liên tiếp. Theo như ví dụ của meocon thì dãy con tăng có tổng lớn nhất phải là: 1 2 4 5 8 9 12. Bạn meocon kiểm tra lại xem.

Bài 28. Đếm số password!

Mỗi người dùng trong một hệ thống máy tính đều có một password dài 6 ký tự , trong đó các ký tự là chữ cái hoa hay chữ số, hay ký tự lạ. Mỗi password phải chứa ít nhất 1 chữ cái hoa, một chữ số và một ký tự lạ. Hõi có thể có bao nhiêu password.

Gọi n là số ký tự lạ được phép dùng đặt password.Tổng số password có thể có: (26+10+n)6 = (36+n)6 (1)Tổng số password không chứa chữ cái hoa: (10+n)6 (2)Tổng số password không chứa chữ số: (26+n)6 (3)Tổng số password không chứa ký tự lạ: (26+10)6=366 (4)Vậy số password dài 6 ký tự có chứa ít nhất 1 chữ cái hoa, 1 chữ số và 1 ký tự lạ là:(1) - (2) - (3) - (4) = (36+n)6 - (10+n)6 - (26+n)6 - 366

Theo tôi, "Tổng số password có thể có: (26+10+n)6 = (36+n)6" là ko đúng mà phải là "Chỉnh hợp chập 6 của (26+10+n) phần tử".Do đó Tổng số password có thể có: (36+n)! / (30+n)!Xin cho ý kiến nếu tôi nhầm lẫn , tks

Cảm ơn bạn đã đóng góp ý kiến. Mình xin phân tích như sau:Password có 6 ký tự, mỗi ký tự có (26+10+n) cách chọn.Vậy ký tự thứ 1 có (26+10+n) cách chọn. Ứng với mỗi cách chọn của ký tự thứ 1, thì ký tự thứ 2 cũng có (26+10+n) cách chọn. Tương tự cho ký tự thứ 6.Theo nguyên lý nhân của phép đếm thì tổng số cách chọn sẽ là (26+10+n)6.

Nếu hiểu là password phải vừa có ít nhất một chữ cái hoa, vừa có ít nhất một số, và vừa có ít nhất 1 ký tự lạ thì:Tổng số pass word có thể có ở đây còn bao gồm cả loại: chỉ toàn chữ hoa(26^6), chỉ toàn số(10^6), chỉ toàn ký tự lạ(n^6).Mình cần trừ thêm khoảng này này nữa.Hông biết em hiểu có đúng đề bài hông nữa?

Cảm ơn câu hỏi của bạn dù rằng trong cách giải trên của mình đã trừ luôn những trường hợp bạn đưa ra. Nhưng nhờ câu hỏi của bạn mà mình nghĩ kỹ thì thấy cách giải trên đã trừ dư (trừ lặp), nghĩa là đã bị sai.Xin được phân tích lại bài toán:Gọi X là tập tất cả password có chứa ít nhất 1 chữ cái hoa, một chữ số và một ký tự lạ

26

Page 27: Baitap ktlt

Gọi A là tập tất cả password, |A| = (26 + 10 + n)6.Gọi B là tập tất cả password không chứa chữ cái hoa, |B| = (10 + n)6.Gọi C là tập tất cả password không chứa chữ số, |C| = (26 + n)6.Gọi D là tập tất cả password không chứa chữ ký tự lạ, |D| = (26 + 10)6.Khi đó:

Trong đó:- B ∩ C là tập các password không chứa chữ cái hoa và chữ số, nghĩa là chỉ chứa kí tự lạ, |B ∩ C| = n6.- B ∩ D là tập các password không chứa chữ cái hoa và kí tự lạ, nghĩa là chỉ chứa chữ số, |B ∩ D| = 106.- C ∩ D là tập các password không chứa chữ số và kí tự lạ, nghĩa là chỉ chứa chữ cái hoa, |C ∩ D| = 266.- B ∩ C ∩ D là tập các password không chứa chữ cái hoa, chữ số và kí tự lạ, tập này là rỗng.Vậy |X| = (26 + 10 + n)6 - (10 + n)6 - (26 + n)6 - (26 + 10)6 + n6 + 106 + 266.

Ah, đúng rùi trong cách làm cũ của admin đã bao gồm cái em hỏi rùi. Hihi...Nhưng với cách làm mới của anh thì: - Chứng minh thì hợp lý.- Nhưng hiểu theo nghĩa thông thường thì hổng hợp lý phải hông admin (tại sao hổng trừ cái khoản đó ra? Tại sao admin bảo là bị lặp?).

Bài 29. Cho đồ thị vô hướng được lưu trữ trong file văn bản dothi.in theo khuôn dạng sau:

- Dòng đầu tiên ghi số đỉnh của đồ thị

- Mỗi dòng kế tiếp ghi hai đỉnh của một cạnh đồ thị, hai đỉnh được ghi cách nhau một hoặc vài ký tự trống.

Viết chương trình kiểm tra tính liên thông của đồ thị, kết quả được ghi trong file văn bản ketqua.out theo khuôn dạng như sau:

- Dòng thứ nhất ghi : đồ thị liên thông hoặc đồ thị không liên thông

- Nếu đồ thị không liên thông thì mỗi dòng tiếp theo ghi các đỉnh của một thành phần liên thông.

Ví dụ:

file dothi.in

81 21 72 73 54 64 8

27

file ketqua.out

do thi khong lien thongthanh phan lien thong thu 1: 1 2 7thanh phan lien thong thu 2: 3 5thanh phan lien thong thu 3: 4 6 8

Page 28: Baitap ktlt

6 8

Chú ý: làm bài tập tương tự với đồ thị có hướng

Bài giải 35

Bài 30. Cho n thành phố, người du lịch xuất phát từ một thành phố, đi thăm tất cả các thành phố còn lại mỗi thành phố một lần và quay về thành phố xuất phát. Viết chương trình tìm lộ trình có chi phí nhỏ nhất, biết rằng bảng chi phí lưu trong file văn bản Chiphi.in theo khuôn dạng sau:

Dòng đầu tiên ghi lại hai số tự nhiên n và s (n là số thành phố, s là thành phố xuất phát), hai số được viết cách nhau bởi một hoặc vài kí tự trống.

Trên n dòng kế tiếp, dòng thứ i (i=1,..,n) ghi n số nguyên dương ci,1; ci,2;…; ci,n với ci,j

là chi phí đi từ thành phố thứ i đến thành phố j, ci,j bằng 0 nếu không có đường đi trực tiếp từ i đến j, các số được viết cách nhau bởi một hoặc vài kí tự trống.

Chi phí nhỏ nhất và lộ trình có chi phí nhỏ nhất tìm được, hãy ghi lại trong file Lotrinh.out theo khuôn dạng sau:

Dòng đầu tiên ghi lại chi phí nhỏ nhất.

Dòng kế tiếp ghi lại lộ trình tối ưu.

Ví dụ dưới đây sẽ minh họa cho file Chiphi.in và file Lotrinh.out của bài toán

Chiphi.inLotrinh.out4 30 5 3 14 0 2 46 1 0 59 3 2 0

Bài giải 36

Bài 31. Số điện thoại di động của một hãng viễn thông là một số có 10 chữ số dạng 09.M.N.XXX.XXX. Miền xác định của các chữ số M, N. X được xác định như sau:

M là số có giá trị từ 1 đến 7.

N là số có giá trị từ 2 đến 9.

X là số có giá trị từ 0 đến 9.

Hãy cho biết hãng viễn thông có thể phát hành được bao nhiêu số điện thoại thuộc mỗi loại a, b, c, d dưới đây?

a) Số các số di động có sáu số cuối cùng XXX.XXX tạo thành một số thuận nghịch sáu chữ số? Ví dụ số: 0913. 103301 có sáu số cuối cùng là 103301 là số thuận nghịch.

b) Số các số di động có sáu số cuối cùng XXX.XXX tạo thành một số thuận nghịch sáu chữ số và tất cả các chữ số này đều khác 0? Ví dụ số: 091.2.122221 có sáu số cuối cùng 122221 là một số thuận nghịch và không chứa số 0 nào.

c) Số các số di động có sáu số cuối cùng XXX.XXX là một số thuận nghịch có sáu chữ số và tổng sáu chữ số cuối cùng là 20? Ví dụ số: 0913.505505.

d) Số các số di động có sáu số cuối cùng XXX.XXX là một số thuận nghịch có sáu chữ số và tổng sáu chữ số cuối cùng là 42? Ví dụ số: 0913.984489.

28

Page 29: Baitap ktlt

e) Số các số di động có sáu số cuối cùng X1X2X3.X4X5X6 là một số thuận nghịch có sáu chữ số và tổng sáu chữ số cuối cùng là 42? Biết rằng 1<X1<=3; 3<=X2<5;X3<=2

HD:

a) 7.8.9.10.10=50400

b) 7.8.9.9.9=40824

c) x1+x2+x3=10 (1<=x1<=9; 0<=x2<=9; 0<=x3<=9)

Đặt:

A={1<=x1<=9; 0<=x2<=9; 0<=x3<=9}; |A|=?

X={x1>=1; x2>=0; x3>=0 }=>|X|=C(n+k-1,k)=C(11,9)=55

Ta có:

AX=>|A|=|X|-|A|

A ={x1>=10 hoặc x2>=10 hoặc x3>=10}=A1A2A3

với:

A1={x1>=10; x2>=0; x3>=0}=>|A1|=C(2,0)=1

A2={x1>=1; x2>=10; x3>=0}=>|A2|=0

A3={x1>=1; x2>=0; x3>=10}=>|A3|=0

do AiAj = với ij nên

|A|=| A1A2A3|=|A1|+|A2|+|A3|=1

=> |A|=55-1=54

=>Đáp số= 56.54=3024

d) x1+x2+x3=21 (1<=x1<=9; 0<=x2<=9; 0<=x3<=9)

Đặt:

A={1<=x1<=9; 0<=x2<=9; 0<=x3<=9}; |A|=?

X={x1>=1; x2>=0; x3>=0 }=>|X|= C(22,20)=231

Ta có:AX=>|A|=|X|-|A|

A ={x1>=10 hoặc x2>=10 hoặc x3>=10}=A1A2A3

với: A1={x1>=10; x2>=0; x3>=0};A2={x1>=1; x2>=10; x3>=0}

A3={x1>=1; x2>=0; x3>=10}

|A|=| A1A2A3|=|A1|+|A2|+|A3|-|A1A2|-|A1A3|-|A2A3|+|A1A2A3|

Ta có:

|A1|= C(13,11)=78

|A2|=|A3|=C(12,10)=66

|A1A2|=|A1A3|= C(3,1)=3; |A2A3|=C(2,0)=1

|A1A2A3|=0

Vậy:

|A|=78+66+66-3-3-1+0=203=> |A|=231-203=28

29

Page 30: Baitap ktlt

=>Đáp số= 56.28=1568

e) x1+x2+x3=21 (1<x1<=3; 3<=x2<5;x3<=2)

Đặt:

A={1<x1<=3; 3<=x2<5; x3<=2}; |A|=?

X={x1>=2; x2>=3; x3>=0 }=>|X|=C(n+k-1,k)=C(3+16-1,16)=C(18,16)=153

Ta có:

AX=>|A|=|X|-|A|

A ={x1>=4 hoặc x2>=5 hoặc x3>=3}=A1A2A3

với:

A1={x1>=4; x2>=3; x3>=0}

A2={x1>=2; x2>=5; x3>=0}

A3={x1>=2; x2>=3; x3>=3}

|A|=| A1A2A3|=|A1|+|A2|+|A3|-|A1A2|-|A1A3|-|A2A3|+|A1A2A3|

Ta có:

|A1|=|A2|=C(16,14)=120; |A3|=C(15,13)=105

|A1A2|=C(14,12)=91; |A1A3|=|A2A3|=C(13,11)=78

|A1A2A3|= C(11,9)=55

Vậy:

/|A|=120+120+105-91-78-78+55=153 => |A|=0

=>Đáp số=56.0=0

Bài 32. Bài 1:

a) Cài đặt thuật toán Heap Sort: dãy ai gọi là heap nếu ai>=a2i ; a2i+1 với mọi i=1,2,...

b) Cài đặt thuật toán Ternary Heap sort: dãy ai gọi là heap nếu ai>=a3i-1; a3i; a3i+1 với mọi i=1,2,….

Bài giải 39

30