1. Trang chủ
  2. » Cao đẳng - Đại học

bai6pascal

54 21 0

Đ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

Nội dung

An biÕt ®îc thêi gian cÇn ®id tõ nhµ ®Õn tõng cöa hµng vµ gi÷a c¸c cöa hµng còng nh chi phÝ trªn tõng chÆng ®êng t¬ng øng.. Thêi gian vµ chi phÝ trªn mçi chÆng ®êng lµ tèi u , kh«ng nh[r]

(1)

Chơng I: Quy Hoạch Động

Các Bài toán quy hoạch động chiếm vị trí quan trọng việc tổ chức hoạt động sản xuất ( Nhất việc giải tốn tối u ) Chính lẽ mà kỳ thi học sinh giỏi Quốc Gia Quốc Tế thờng gặp loại toán T tởng chủ đạo phơng pháp dựa nguyên lí tối u BellMan phát biểu nh sau : "Nếu dãy lựa chọn tối u dãy tối u "

Ngoài thiết kế thuật toán quy hoạch động ta thờng dùng kỹ thuật "Phân vùng để xử lí " , Nghĩa để giải tốn lớn ta chia thành nhiều tốn giải độc

lập Trong phơng pháp quy hoạch động ,việc thể nguyên lí đợc đẩy đến cực độ Để giải toán quy hoạch động ta theo sơ đồ sau :

a.) Lập hệ thức : Lập hệ thức biểu diễn tơng quan định bớc xử lí với bớc xử lí trớc Hệ thức thờng biểu thức đệ quy dễ thấy tợng tràn nhớ

b.) Tổ chức liệu chơng trình : Tổ chức giữ liệu tính tốn dần theo bớc Nên tìm cách khử đệ quy Thơng thờng ,trong tốn tin hay gặp đòi hỏi vài mảng lớn

c.) Làm tốt : Làm tốt thuật toán cách thu gọn hệ thức quy hoạch động giảm kích thớc miền nhớ

Các thao tác tổng quát quy hoạch động : Xây dựng hàm quy hoạch ng

2 Lập bảng lu lại giá trị hàm Tính giá trị ban đầu bảng

4 Tính giá trị cịn lại theo kích thớc tăng dần bảng đạt đợc giá trị tối u cần tìm

5 Dùng bảng lu để truy xuất lời giải tối u

Trong lời hớng dẫn toán , đa bạn theo phần nh sơ đồ giải Chúng ta phân loại toán quy hoạch động theo nhiều cách Để bạn tiện theo dõi , xin phân loại theo cách lu( tức tổ chức chơng trình )là mảng chiều hay nhiều chiều

I

D¹ng Mé t:

Đa Phần dạng toán thờng gặp loại loại có cơng thức truy hồi nh sau :

Mind[I]:=Min Mind[J] +Giá Trị Để tồn JI ;J=0 I Hoặc :

Maxd[I]:=MaxMaxd[J]+Giá Trị §Ĩ tån t¹i JI ;J=0 I

Chúng ta thấy rõ ràng toán mà xét sau :

(2)

Đề Bài :

"Cho ngân hàng có N loại tiền mệnh giá A[1],A[2], A[N] với số lợng tiền loại không giới hạn Cần chi trả cho khách hàng số tiền M đồng Hãy cho biết cần tiền loại để chi trả cho số lợng t l ớt nht

Dữ liệu vào từ File : Tien.Inp Nh sau : Dòng ghi sè N,M

( N<=100,M<=10000)

 Dßng thø hai ghi N Sè : A[1], A[2], A[N] , (a[i]<a[i+1])

KÕt qu¶: ghi File : Tien.Out Nh Sau :

 Dòng Đầu tiên ghi số tờ cần dùng ,Nếu khơng thể đổi đựoc ghi số không cần thực tiếp

 Dßng tiÕp theo ghi n sè biĨu hiƯn cho sè tờ cần dùng cho loại "

Hớng Dẫn :

Chúng ta gọi Mind[I] số lợng tờ để trả số tiền I , Nh toán yêu cầu xác định Mind[M] Ta nhận thấy để đợc số tiền I có cách để tạo thành số tiền dùng thêm tờ Là : I-A[K1],I-A[K2], I-A[KJ] ,Trong KJ Là số Thoả mãn mà A[KJ]<I Vậy để số tiền tối u cần tìm thấy Mind[I-A[K1]]+1,Mind[I-A[K2]]+1, Mind[I-A[KJ]]+1 Có Cơng thức quy hoạch động nh sau:

Mind[I]:=Min Mind[I-A[J]]+1, J Tho¶ M·n : A[J]<I

Từ có thủ tục quy hoạch động nh sau :

Procedure Quy_Hoach_Dong; Begin

Mind[0]:=0;

For I:=1 To M Do Begin

Min:=Maxint;

For J:=1 To N Do

If (Mind[I-A[J]]+1<Min)And (A[J]<I) Then

Begin

Min:=Mind[I-A[J]]+1; Luu[I]:=J;

End;

Mind[I]:=Min; End;

End;

Trong mảng Luu mảng chứa đựng loại tiền cần dùng cuối để đến số tiền I Nh có cách để tìm lại loại tiền cần dùng mảng Luu nh sau :

J:=Luu[M]; I:=M;

(3)

Write(A[J]); I:=I-J;

J:=Luu[I]; End;

Nh giải toán cách ngắn gọn đơn giản Để tăng tính tự sáng tạo bạn , kể từ tốn sau chúng tơi nêu qua thủ tục công thức quy hoạch động Nếu bạn không giải đợc vấn đề nhỏ tham khảo phần lời giải Tiếp sau loạt toán tơng tự toán mà thực chất chúng dạng cố định ,nó biến dạng lời lẽ nhng giống v bn cht

Bài Toán 2: Bài Toán Nối Điểm (Wires)

Đề :

" Trên Hai đuờng thẳng song song L1 L2 ,Ngời ta đánh dấu đờng N Điểm ,Các điểm đơng thẳng L1 Đợc đánh số từ đến N, từ trái qua phải , điểm đờng thẳng L2 đợc đánh số P[1],P[2], P[N] từ trái qua phải , P[1],P[2], P[N] hoán vị số 1,2, N

Ta gọi số gán cho điểm số hiệu chúng Cho phép nối hai điểm đờng thẳng có số hiệu

Yêu Cầu : Tìm cách nối đợc nhiều cặp điểm với điều kiện đoạn nối không đợc cắt

Dữ Liệu : Vào từ File BaiToan2.Inp:

Dòng Đầu tiên chứa số Nguyên Dơng N(N<=1000) Dòng thứ hai chứa số P[1],P[2], P[N] Kết Quả Ghi Ra File : BaiToan2.Out

 Dòng Đầu tiên chứa K số lợng đoạn nối tìm đợc  Dịng chứa K số hiệu đầu mút

các đoạn nối đợc ghi theo thứ tự tăng dần Ví Dụ :

WIRES.INP WIRES.OUT

9

2 52 "

Híng DÉn :

Gọi Maxd[I] số đoạn thẳng tối đa cặp nối điểm t 1I Chúng ta có cơng thức quy hoạch động nh sau :

Maxd[I]:=MaxMaxd[P[J]]+1;J:=0ViTri(I) Trong ViTri (I) Là hàm cho biết Vị trí Của I Trong Dãy P[1],P[2], P[N] ( Tức I=P[X] Thì ViTri(I)=X); Bằng cách phân tích hồn tồn tơng tự nh tốn mà ta có cơng thức truy hồi nh Các bớc giải tốn đợc nói gọn hai thủ tục hàm :

(4)

Begin

For J:=1 To N Do If P[J]=I Then Begin

ViTri:=J; Exit; End;

End;

Thủ Tục Quy Hoạch động nh sau : Procedure Quy_Hoach_Dong; Begin

Maxd[0]:=0;

For I:=1 To N Do Begin

Max:=0;

For J:=0 To ViTri(I) Do If Maxd[P[J]]>Max Then Begin

Luu[I]:=J;

Max:=Maxd[P[J]]; End;

Maxd[I]:=Max; End;

End;

Mảng Luu mảng luu[I] lu lại điểm trớc I mà tiếp nối I Chính điều đo ghi ngợc lại cách dễ dàng Hồn tơng tự , giải tơng tự cho toán sau :

Bài Toán 3: Dạo Chơi Bằng Xe Buýt

 §Ị :

" Trên tuyến đờng thành phố du lịch tiếng X có tô Buýt công cộng phục vụ việc lại du khách Bến xe buýt có Km tuyến đờng Mỗi lần qua bến xe đỗ cho du khác lên xuống Mỗi bến có xe xuất phát từ , nhng xe chạy không B Km kể từ bến xuất phát Hành khách xe phải trả tiền cho độ dài đoạn đờng mà họ ngồi xe Cớc phí cần trả để đoạn đờng độ dài i Ci (I=1,2, B) Một du khách xuất phát từ bến muốn dạo L Km tuyến đờng nói Hỏi ông ta phải lên xuống xe nh để tổng số tiền phải trả cho chuyến dạo chơi xe buýt nhỏ Dữ Liệu : Vo T File : Bus.Inp

Dòng chứa số nguyên dơng B,L (B<=100,L<=10000)

Dòng thứ hai chứa B số Nguyên dơng C1,C2, Cn , đợc ghi cách dấu trắng

KÕt Quả : Ghi File Văn Bản : Bus.Out

 Dịng đầu tien ghi chi phí tìm đợc ,và số lần xuống xe K

(5)

VÝ Dô:

BUS.INP

BUS.OUT 10 15

12 21 31 40 49 58 69 79 90 101

147 3 6 "

Híng DÉn :

Gọi Mind[I] Là số tiền cần trả ngời cần I Km Chúng ta có cơng thức quy hoạch động :

Mind[I]:=MinMind[I-J]+A[J]; J: J<=I ; Giá trị Mind[L] gía trị cần tính

Bài Toán 4: DÃy Con Tăng Cực Đại

 §Ị :

" Cho dãy số nguyên dơng A1,A2, An Hãy tỉa bớt số phần tử dãy số nguyên vầ giữ nguyên thứ tự phân tử lại cho dãy số lại dãy tăng dần Ta gọi dãy số nguyên tăng dần lại sau tỉa bớt số phần tử dãy dãy cho

D÷ Liệu : Vào từ File BaiToan4.Inp :

Dòng ghi số N số phần tử (N<=10000) Dòng ghi N số số nguyªn cđa d·y KÕt Qđa : Ghi Ra FIle : BaiToan4.Out

 Dòng ghi số phần tử dãy lớn

 Dßng thø hai ghi số dÃy cần tìm " Híng DÉn :

Gọi Maxd[I] số phần tử lớn dãy dài phần tử từ 1I Chúng ta có cơng thức quy hoạch động :

Maxd[I]:=MaxMaxd[J]+1; Víi J=1 I-1 , A[J]<A[I]

Bài Toán 5: Bố Trí Phòng Họp Đề :

Cú N cuc hp đánh số từ đến N đăng ký làm việc phòng hội thảo Cuộc họp i cần đợc bắt đầu thời điểm Ai kết thúc thời điểm Bi (i=1,2, N) Hai họp đợc nhận phục vụ khoảng thời gian làm việc tơng ứng đợc giao đầu mút Hãy tìm lịch cho phịng hội thảo để phục vụ đợc nhiều họp

Dữ Liệu: Vào đợc cho file Activity.Inp gồm :  Dòng ghi giá trị N

 Dßng thø i sè N dòng tiếp ghi số nguyên Ai Bi cách dấu trắng

Kết Quả : CÇn ghi file Activity.Out nh sau :  Dòng ghi giá trị K số häp tèi ®a

(6)

 K dịng ,mõi dòng ghi số hiệu họp đợc phục vụ theo trình tự lịch bố trí

Giới Hạn kích thớc : N không 10000

Các giá trị Ai, Bi (i=1,2, N) không qu¸ 32000 VÝ Dơ:

Activity.Inp Activity.Out

4

Híng DÉn :

- Đầu tiên ta xếp họp theo

chiều tăng dÃy b

Chúng ta gọi Maxd[i] số họp nhiều bố trí có họp i Ta có :

Maxd[i]:=MaxMaxd[j]+1; j=0 i-1 ;

Sau số họp nhiều bố trí giá trị lớn số Maxd[i]

Chú ý : tốn thay đổi cách đề : coi họp lần ghi âm chẳng

hạn Chính thực chất CDWrite ( bạn đọc CDWrite ,nếu cha bạn cần làm )

Bài toán 6: Vòng Quanh Thế Giới

(Đề Thi Häc Sinh Giái Quèc Gia 20002001 -B¶ng A )

-§Ị :

Trên tuyến đờng xe chở khách du lịch vòng quanh giới xuất phát từ bến X có N khách sạn đánh số từ đến N theo thứ tự xuất tuyến đờng , khách sạn N địa điểm cuối tuyến đờng mà xê bắt buộc phải dừng Khách sạn I cách địa điểm xuất phát Ai Km

(I=1,2, N);A1<A2< <AN

Để đảm bảo sức khẻo cho khách hàng , theo tính tốn nhà chun mơn, sau chạy đợc P (Km) xe nên dừng lại cho khách nghỉ khách sạn Vì ,nếu xe dừng lại cho khách nghỉ khách sạn sau đợc Q(Km) lái xe phải trả lợng phạt : (q-p) * (q-p) Ví Dụ :

Víi N=4 ,P=300,A1=250, A2=310, A3=550

,A4=590 Xe bắt Buộc phải dừng lại khách sạn địa điểm cuối hành trình Nếu đờng lái xe dừng lại khách sạn thứ lợng phạt phải trả :

(310-300) * (310-300) + ((590-310)-300) * ((590-310)-300) = 500

(7)

Dữ Liệu : Vào từ File văn có tên Bai5.Inp : Dòng chứa số nguyên dơng N(N<=10000); Dòng thứ hai chứa số nguyên dơng P (P<=500);

Dòng thứ ba chứa số nguyên dơng A1,A2,A3, An ( hai số liên tiếp c¸ch Ýt nhÊt bëi dÊu c¸ch ) ( Ai<=2000000 ,i=1,2, N)

KÕt Qu¶ : Ghi File Văn Bản Bai5.Out:

Dòng ghi Z lợng phạt mà lái xe phải trả ;

Dòng thứ hai ghi K tổng sô khách sạn mà lái xe cần dừng lại cho khách nghỉ;

 Dòng thứ ba chứa số K khách sạn mà xe dừng lại cho khách nghỉ ( Trong thiết phải có khách sạn thứ N)

VÝ Dô:

BAI5.INP BAI5.OUT 300 250 310 550 590 500 2

Híng DÉn :

Gọi Mind[i] lợng phạt ngời lái xe dừng lại địa điểm i Chúng ta có cơng thức truy hồi :

Mind[i]:=MinMind[j]+sqr(a[i]-a[j]-p); j=1, i-1

Tuy nhiên toán cha phải đợc giải Bởi cịn q nhiều vấn đề cần giải khác :

 Lợng phạt lớn , vợt longint mà chứa real khơng thể lu đợc mảng có 10000 phần tử Chính cần giải tốt liệu toán

Nếu N=10000 chơng trình phải chạy : (9999+1)*9999/2 Tức lâu

Chính bạn cần phải hồn thành cách đắn điều kiện

Hồn tồn biến dạng ngơn ngữ diễn tả tốn , nhng có nhiều tốn ẩn rõ thuật toán , xét toán sau : Bài toán : Car

Đề :

Cho mt on xe hộ tống có n đờng chiều đợc bố trí theo thứ tự từ đến n Mỗi xe đồn tren có vận tốc V trọng lợng W

Khi qua cầu có trọng tải khơng q P phải chia đồn xe thành nhóm cho tổng trọng lợng nhóm khơng q P Thêm vào nhóm phải Nghĩa nhóm thứ i đợc mà tồn xe nhóm thứ i-1 qua cầu

Vận tốc đí nhóm hoàn toàn khác phụ thuộc vào xe có tốc độ chậm đợc

(8)

 Dòng ghi số n( n 1000) P,L thể cho số xe, trọng lợng tối đa cầu L độ di ca cu

N dòng ,mỗi dòng gồm số W V thể cho trọng lợng vận tốc xe

Kết Quả : file Car.Out nh sau:

 Dòng tổng thời gian nhỏ để đoàn xe qua cu

Dòng gồm số X1,X2, Xk thĨ hiƯn: Nhãm 1lµ tõ X1,nhãm lµ tõ X1+1 X2, VÝ Dơ :

Car.inp Car.out

10 100 100 40 25

50 20 70 10 12 50 70 49 30 38 25 27 50 19 70

25 10

Híng DÉn :

Gọi Mind[i] tổng thời gian nhỏ đoàn xe có số hiệu từ đến i qua cầu Ta có cơng thức truy hồi :

Mind[i]:=MinMind[j]+Time(j,i) ; j = 1, i-1 Với time(j,i) thời gian đoàn xe gồm từ thứ j thứ i qua cầu lúc ( có nghĩa vợt q trọng tải

Time(j,i)= )

Bài toán : Khuyến Mại

Đề :

Vo ny No-en , N cửa hàng thành phố tặng quà cho khách hàng Các cửa hàng có tên N , N<=100 Một lần tặng quà đợc thể ba số nguyên dơng X , Y , Z với ý nghĩa cửa hàng X thời điểm Y tặng quà giá trị Z Với lần tặng q , ngời muốn nhận phải có mặt khơng muộn thời điểm phát quà vủă hàng chu đáo đến mức thời gian nhận quà xem nh bng

Không có hai lần tặng quà diễn thời điểm

An muốn tận dụng ngày để hy vọng có nhiều quà hấp dẫn An xuất phát từ nhà thời điểm phải quay đến nhà không muộn thời điểm M Hãy lập cho An kế hoạch nhận quà cho tổng số giá trị thu đợc lớn

(9)

này đến mộ cửa hàng khác , An không ghé thăm qua cửa hàng khác Tổng giá trị An thu đợc tổng giá trị quà tặng đợc trừ tổng chi phí mà An phải trả chặng đờng từ nhà đến cửa hàng , từ lần lợt đến cửa hàng khác quay đến nhà

Dữ liệu : vào đợc cho file văn : KM.INP dịng thứ ghi ba số N , M , K mà K số lần phát quà , N<=100 , M<=60000 , K <= 5000 Tiếp theo K dòng , dòng thứ i K dòng ghi ba số X , Y , Z thể lần phát quà ta quy ớc gọi lần phát quà thứ i Sau N + dịng , dịng thứ i ghi N + số mà số thứ j thời gian từ cửa hàng i đến cửa hàng j Cuối N + dòng , dòng thứ i n + dòng ghi N + số , mà số thứ j chi phí để từ cửa hàng thứ i đến cửa hàng thứ j Nhà An xem nh cửa hàng rhứ N + Với cửa hàng i , thời gian chi phí từ i đến i Tổng giá trị lớn AN thu đợc không tỷ

KÕt Qu¶ : ghi file : KM.OUT nh sau :

 Dòng thứ ghi số S tổng giá trị An thu đợc  Tiếp theo số dòng , dòng ghi số hiệu

một lần nhận qùa mà theo trình tự An lần lợt đến nhận

VÝ Dô :

KM.INP KM.OUT

2 13 10 20 25 10 10 10 2

0 1 0 1 1 1 52

Híng DÉn :

Các cửa hàng xếp đờng thẳng theo trật tự tăng dần thời gian khuyến mại Nếu cửa hàng có nhiều lần khuyến mại coi nh cửa hàng khác Bài toán trở thành toán : Trên đờng đờng cần ghé thăm cửa hàng để số tiền khuyến mại lớn

Gọi Maxd[i] số tiền khuyến mại lớn ta đến nhận khuyến mại thời điểm i ( thời điểm có cửa hàng khuyến mại , nên coi nh ánh xạ ) Nếu không nhận khuyến mại thời điểm i số tiền ta tìm theo cơng thức :

Maxd[i]:=Maxmaxd[j]+tiền nhận đợc từ i tới j - tiền đi; j=1, i-1 với điều kiện thời điểm j phải có khuyến mại ;

maxMaxd[i] ;i=1, kchính số tiền cần lấy Bài Toán 9: xây tháp

(10)

lờn Để đảm bảo an toàn, khối đá đợc đặt theo nguyờn tc:

+ chiều cao khối lµ kÝch thíc nhá nhÊt ba kÝch thíc,

+ mép khối đợc đặt song song với cho khơng có phần khối nằm bị chìa ngồi so với khối nằm dới

Hãy tìm phơng án xây dựng để tháp đạt đợc độ cao

Dữ liệu vào đợc cho file Tower.INP gồm: + dòng đầu số N,

+ N dòng sau, dòng ghi số nguyên dơng kích thớc khối đá Các khối đá đợc đánh số từ theo trình tự xuất file

KÕt qu¶ ghi file Tower.OUT theo quy c¸ch:

+ dịng thứ ghi số M số lợng khối đá dùng xây tháp,

+ M dòng ghi khối xếp từ đáy tháp lên đỉnh, dòng gồm số theo thứ tự: K A B C, K số hiệu khối đá, A kích thớc chọn làm đáy nhỏ, B kích thớc chọn làm đáy lớn, C kích thớc chọn làm chiều cao

Các số dòng file đợc ghi cách dấu trắng Giới hạn số khối đá không 5000 kích thớc khối đá khơng q 255

ThÝ dô:

Tower.INP Tower.OUT

9

7 5 4 1 2 5 3 5

4

1 5 5 5 4

Híng DÉn:

Chúng ta thấy hình dới hình khác kích thớc ngang dọc lớn kích thớc Chúng ta không tổng quát , quy định chiều tháp theo chiều định ( ví dụ : dài độ dài có kích thớc lớn trịn ba kích thớc , rộng lớn thứ hai cuối cao )

Sắp xếp tháp theo chiều giảm dần diện tích Sau Maxd[i] độ cao xếp tháp thứ i ( dãy sau xếp )

Maxd[i]:=maxmaxd[j]+cao[i] ; víi j =1, i-1 vµ réng [j]>=réng[i],dµi[j]>=dµi[i];

(11)

Bµi toán 10 : RenTing Đề Bài:

Ti thời điểm 0,ơng chủ máy tính suất cao nhận đợc đơn đặt hàng thuê sử dụng máy N khách hàng Các khách hàng I cần sử dụng máy từ thời điểm Di đến thời điểm Ci ( Di,Ci số nguyên 0<Di<Ci<109) trả tiền sử dụng máy Pi ( Pi nguyên , 0<=Pi<=107) Bạn cần xác định xem ông chủ cần nhận phục vụ khách hàng cho khoảng thời gian sỉ dụng máy khách hàng đợc nhận phục vụ không đuợc giao , đồng thời tổng số tiền thu đợc nhiều Dữ Liệu : Vào Từ File vân RENTING.INP :  Dòng ghi số N (0<N<=1000)

 Dßng thø I+1 sè n dßng tiÕp theo ghi sè Di,Ci,Pi c¸ch bëi dÊu c¸ch(I=1, N)

Kết : Ghi Ra file Văn Bản RENTING.OUT :

 Dòng ghi hai số nguyên dơng theo thứ tự số lợng khách hàng nhận phục vụ tổng tiền thu đợc từ việc phục vụ họ

 Dòng ghi số khách hàng đợc nhận phục vụ

VÝ Dô:

RENTING.INP RENTING.OUT RENTING.INP RENTING.OUT

3 150 500 150 200 100 400 800 80 180

4 400 821 800 200 513 500 100 325 200 600 900 600 1100

Híng DÉn :

Sắp xếp theo thứ tự tăng dần Di Sau gọi Maxd[i]laf tổng số tiền nhận đợc phục vụ ngời thứ i ( dãy sau ) Lúc ta có :

Maxd[i]:=MaxMaxd[j]+Pi; j=1 i-1; vµ Di>=Cj;

VËy sè tiỊn lớn = Max maxd[i];i=1 n II Dạng Hai :

Các Bài toán dạng thờng có chơng trình giống thuật toán Ford-Bellman

Repeat

Ok:=True ;

IF tìm đợc Mind[i] thoả mãn

Mind[i]>Mind[j]+giá trị từ j đến i Then Begin

Ok:=False ;

Mind[i] :=Mind[j]+giá trị từ j đến i End ;

Until Ok ;

Tơng tự cho Maxd [i].Vơí q trình j đến i q trình thoả mãn điều kiện toán Bài Toán 11:

(12)

Chúng ta định nghĩa hàm AR(m,n) , với m,n số tự nhiên (0<n<10, 0<m<1000) số tự nhiên cho biểu diễn n phép toán : +,-,*, / phép toán ghép số , số nhỏ cần thiết chữ số n để đợc kết số m giá trị ca hm AR(m,n)

Để cho bạn dễ hiểu xét hàm AR(42,2)=4 ta có c¸ch biĨu diƠn :

2*22-2=42 hay chóng ta cã AR(22,1)= v× : 11*(1+1)=22

Bài tốn đặt cho tìm AR(m,n) ,vi m,n bit trc

Dữ liệu : Vào từ file văn Apower.Inp gồm nhiều số m,n Mỗi dòng viết số

Kết Quả: Ghi file văn Apower.Out gồm nhiều dòng , dòng ứng với kết qủa dòng file input

VÝ Dô:

APOWER.INP APOWER.OUT

42 22 4 Híng DÉn :

Chúng ta gọi Ar[m,n] giá trị hàm Ar(m,n) Ta có thủ tục quy hoạch động :

Fillchar(Ar,Sizeof(Ar),Maxint); Ar[0]:=2 ;

Ar[n]:=1; RePeat

Ok := True ;

For i:=1 to (m+1)*n if Ar[m,i]<>maxint then For j:=1 to (m+1)*n Begin

If (Ar[i]+Ar[j]<A[i+j])then Begin

Ok:=false ;

A[i+j]:=a[i]+a[j]; End ;

If (Ar[i]+Ar[j]<Ar[i-j])and(i>j)then Begin

Ar[i-j]:=Ar[i]+Ar[j]; Ok:=False ;

End ;

If (Ar[i]+Ar[j]<A[i*j])then Begin

Ok:=False ;

Ar[i*j]:=Ar[i]+Ar[j]; End ;

If (I mod j = ) and (Ar[i]+A[j]<A[i div j]) then

Begin

Ok:=False ;

Ar[i div j]:=Ar[i]+Ar[j]; End ;

(13)

Until OK ;

Nhng để tránh trờng hợp đặc biệt nh : 333 với Ar(333,3)=3 Cho nên trớc hết tính Ar[3 3,3]:=số số có Rồi sau ta dùng thủ tục

Bài Toán 12: Giá Trị Biểu Thức Đề Bµi :

Giả thiết X,Y hai số nguyên dơng Kí hiệu Sxlà tổng chữ số dạng biểu diễn số 10 X ,Dmax_y Dmin_y chữ số lớn nhỏ dạng biểu điễn số 10 Y Phép tính hai ngơi # với tốn hạng ngun dơng X,Y đợc định nghĩa nh sau:

( X#Y)=Sx*Smax_y+Dmin_y

VÝ Dô : (30#9)=3*9+9=36 hay (9#30)=9*3+0=27

Víi X cho tríc ,mét sè biĨu thøc hỵp lƯ lµ: (X#X) vµ ((X#X)#X) vµ (X#(X#X)#(X#X)#X) Ký hiệu kết biểu thức K Cho X vµ

K(0<X,K<109-1) cần xác định số m phép # để từ xây dựng biểu thức thuộc dạng xét với X cho kết K biểu thức biểu diễn biểu thức

Dữ Liệu : vào từ file văn Bai16.Inp dßng thø nhÊt chøa sè X , dßng thø hai chøa K

KÕt Qu¶ : Ghi file văn Bai16.Out : dòng thứ chứa số m, dßng thø hai chøa biĨu thøc

VÝ Dơ:

BAI16.INP BAI16.OUT

718 81 ((718#(718#718))#718)

Híng DÉn :

Ta thÊy 0<X,K<109 nªn ta cã : 1<SX<=9*9 ; 1<=Dmax_x<=9 ; 0<=Dmin_x<=9 ;

Nên 1<=X*X<=9*9*9+9=738 ; Vậy giá trị biểu thức hợp lệ bất lỳ phải nằm đoạn [1,738], cốt lõi lời giải cho toán Nếu K nằm khoảng chắn vô nghiệm Xét biểu thức X#X có dÊu # ,dƠ thÊy cÝ c¸ch më réng biĨu thøc dÊu # nµy lµ :

- X#(X#X) ; (X#X)#X ; (X#X)#(X#X) ;

Gi¶ sư B biểu thức tạo X n dấu # có cách mở rộng biểu thức nµy :

 X#B ( n+1 dÊu #) ; B#X ( n +1 dÊu #) ; B#B ( * n+1 dÊu # )

Ta lập mảng chiều Mind[1 738] Mind[i] cho biết số phép # để tạo từ X Ta có bớc giải tốn :

- Bớc : Khởi tạo mảng A[1 738]:=0 đánh dấu giá trị tạo đợc từ biểu thức ó X # , Khởi tạo mảng Mind nhận giá trị Maxint

 Bíc : T×m T=X#X ; A[T]:=1 ; Mind[T]:=1 ;

(14)

For i:=1 to 738 If A[i]=1 then Begin

T:=X#i;

If Mind[T]>Mind[i]+1 then begin Mind[T]:=Mind[i]+1 ;A[T]:=1 ; end ;

T:=i#X ;

If Mind[T]>Mind[i]+1 then begin Mind[T]:=Mind[i]+1 ;A[T]:=1 ; end ;

T:=i#i ;

If Mind[T]>2*Mind[i]+1 then begin

Mind[T]:=2*Mind[i]+1 ;A[T]:=1 ; end ;

End ;

Bài Toán 13 : Đọc Đĩa

( §Ị Thi Häc Sinh Giái Qc Gia 2001-2002 - B¶ng B )

Đề :

Cỏc k s công ti tin học thử nghiệm chế tạo đĩa từ có dung lợng thơng tin cực lớn Đĩa có nhiều đờng ghi khoảng cách đờng ghi liên tiếp nhỏ Các đờng ghi đợc đánh số từ đến N , từ vào Đối với loại đĩa , việc dịch chuyển đầu đọc từ đờng ghi sang đờng ghi khó đảm bảo độ xác cao cho chuyển động học khoảng cách q bé khơng có đủ thời gian để khởi động phanh đầu đọc

Ngời ta thiết kế mạch điều khiển với lƯnh : LƯnh T vµ lƯnh L

Lệnh T- đa đầu đọc tiến lên phía trớc P đờng ghi ( P>0).Ví dụ đầu đọc đờng ghi K Sau thực lệnh T chuyển tới đờng ghi số K +P Lệnh T không áp dụng đợc K+P>N

Lệnh L đa đầu đọc lùi Q đờng ghi (Q>0).Nếu đầu đọc đờng ghi K , sau thực lệnh L đầu đọc chuyển tới đờng ghi K-Q Lệnh L không áp dụng K-Q<0 Để di chuyển đầu đọc từ đờng ghi U tới đờng ghi V phải áp dụng dãy lệnh T,L Dãy m lệnh T (L) liên tiếp đợc viết gọn dạng Tm(Lm) , m - số nguyên dơng , m>=1

Yêu Cầu : Với N,P,Q cho trớc (),N<=20000,0<P,Q<N) dãy câu lệnh L , T đa đầu đọc từ đờng ghi U tới đờng ghi V (0<=U,V<=N) cho biết không tồn dãy câu lệnh nh vy

Dữ Liệu : Vào từ file văn DISK.INP gồm L dòng số nguyên N , P , Q , U , V , c¸c số dòng cách dấu cách

Kết Quả : Đa file văn DISK.OUT :

(15)

Dòng thứ chứa dÃy câu lệnh cần thực , trớc tên lệnh T(L) phải có dấu cách

VÝ Dô :

DISK.INP DISK.OUT

10 L2 T1

Híng dÉn :

Chúng ta có Mind[i] số lần thực lệnh chuyển đĩa chuyển từ U đến i ta thực nh sau :

 Khởi tạo toàn Mind[i] = maxint ; Mind[u]:=0 ;

 Repeat

Ok:=True ;

For i:=0 to n

if mind[i]<>maxint then Begin

If (i-q>0)and(mind[i]+1<mind[i-q] then begin

mind[i-q]:=mind[i]+1; luu[i-q]:=-q ;

ok:=false ; end ;

If (i+p<=n)and(mind[i]+1<mind[i+p]) then

Begin

Mind[i+p]:=mind[i]+1 ; Ok:=False ;

Luu[i+p]:=p; End ;

End ; Until Ok ;

Ta dùng mảng luu[i] để lần ngợc trở nên dễ dàng

Bài Toán 14 : Busways

Đề :

Một hệ thống xe buýt có nhiệm vụ chuyên chở hành khách lại số ga cho đảm bảo tính liên thơng hai chiều ga Hệ thống bao gồm số tuyến đờng , tuyến đờng bao gồm số ga khác theo thứ tự mà xe buýt qua Xe buýt thuộc tuyến đờng chạy tuyến đờng , lần lợt qua ga thuộc tuyến hết , sau lại quay lại chạy theo hớng ngợc lại Có thể có số ga chung cho số tuyến đờng Một hành khách muốn từ ga đầu đến ga cuối , tuyến phải chuyển tuyến số ga cuối cho số lần phải chuyển tuyến Nếu tồn nhiều phơng án nh , tìm phơng án qua

(16)

 Các dịng , dịng mơ tả tuyến đờng , gồm chuỗi ký tự viết liền , kí tự mơ tả tên ga theo thứ tự ga tuyến ( ý ga tuyến khác , nhng ga tuyến khác trùng nhau,tên ga ký tự hiển thị đợc bảng mã ASCII)

 Dßng số hành trình cần tìm

Các dịng ,mỗi dịng mơt tả hành trình cần tìm , gồm cặp ký tự viết liền , xác định tên ga đầu tên ga cuối

Giả thiết liệu cho hợp lệ , không cần kiểm tra Giới hạn kích thớc 100 cho số tuyến đờng , 50 cho số ga tuyến đờng

KÕt qu¶ : Ghi file BusWays.Out : Trong

đó hành trình đợc viết dịng , gồm ký tự biểu diễn tên ga viết theo thứ tự đợc Các tên ga đợc viết thành nhóm theo tuyến đờng : thuộc tuyến đờng viết liền

nhau , sàn tuyến đờng khác viết cách dấu trắng , tên ga chung đợc viết lặp lại Ví Dụ :

BUSWAYS.INP BUSWAYS.OUT

3 ABC DBE GAEH HC GB HEA ABC GA AB Híng dÉn :

Đầu tiên coi ga đỉnh có số hiệu vị trí bảng mã Ascii Sau ta tạo đồ thị có cung mà ga tuyến có độ dài trái tuyến độ dài 1000 Sau dùng thuật giải giả Ford-Bellman ( giống toán ) để tìm đờng ngăn

Hoµn toàn tơng tự bạn giải toán sau :

( - Phần nâng cao , tập lập trình pascal - Nguyễn Xuân My )

Bài toán phụ : Bài toán 15 :

“ Có M tuyến xe buýt, M<=20 Mỗi tuyến xe đợc cho dãy tên bến liên tiếp từ đầu đến cuối tuyến đó, tuyến xe đợc hai chiều Tên bến số nguyên dơng Các tuyến xe có bến chung Nếu từ bến đến bến tuyến đồng tuyến mà chuyển sang tuyến khác bến để đến bến tuyến khác thêm đồng Cho tên hai bến I J Hãy tìm hành trình từ I đến J cho:

1 Chi phÝ lµ Ýt nhÊt

2 Sè lÇn chun tun Ýt nhÊt

(17)

không 20 số nguyên dơng khác đôi thể tuyến xe Các tuyến xe nhận số hiệu từ 1, 2, 3, kể từ xuống dới

KÕt qu¶ ghi file OUT.B5 nh sau:

 Câu 1: dòng thứ ghi chi phí, dịng thứ hai ghi hành trình từ I đến J cách viết bến liên tiếp hành trình, bến ghi nh sau: tên bến/số hiệu tuyến Ví dụ bến 25 tuyến ghi 25/6

 Câu 2: dòng thứ ba ghi số lợng tuyến xe, dịng thứ t ghi hành trình từ I đến J tơng tự nh câu “ III Dạng ba : Lu dữ liệu cách tit kim bin :

Bài toán 16 : Palindrome

( Đề thi Quốc Tế năm 2000 ) Đề Bµi :

Palindrome xâu đối xứng tức xâu mà đọc từ trái sang phải nh đọc từ phải sang trái Bạn cần viết chơng trình với xâu cho trớc , xác định số kí tự cần chèn vào xâu để nhận đợc palindrome

Ví dụ : Bằng cách chèn kí tự vào xâu ‘ Ab3d ‘ ta nhận đợc palindrome Tuy nhiên chèn its kí tự khơng thể tạo đợc palindrome Dữ liệu: Vào file input : palin IN

 Dòng thứ gồm số nguyên độ dài N xâu , 3<=N<=5000

 Dịng thứ hai gồm xâu có độ dài N xâu gồm kí tự chữ hoa A Z, chữ

thêng : a z chữ số thập phân ,các chữ hoa thờng xem

nh khác

D liÖu : Ra file output : palin.out

Dòng số lợng kí tự cần chèn vào Ví dụ:

PALIN.IN PALIN.OUT

5 Ab3bd

Híng DÉn :

Gọi xâu liệu vào s Ta tìm chiều dài dãy đối xứng cực đại trích từ s s1 Khi số ký tự cần thêm =Length(s)-Length(s1) Dãy đợc hiểu dãy thu đợc từ s cách xoá số phần tử s

Gọi Maxd[i,j] chiều dài dãy dài thu đợc từ đoạn s[i j] Ta có :

NÕu S[i]=S[j] th× Maxd[i,j]=Maxd[i+1,j-1]+2 ; NÕu S[i]<>S[j] th× Maxd[i,j]:=Max

Maxd[i,j-1] , Maxd[i+1,j]

(18)

Gäi Luu[0 N+1] mảng cập nhật bớc thực T¹i bíc cËp nhËt thø j ta cã

Luu[j]:=Maxd[i,j]

Ta có lại bảng truy hồi nh sau :

NÕu S[i]=S[j] th× Luu[i]:=Luu[i+1] cị + NÕu S[i]<>S[j] th× Luu[i]:=Max Luu[i] cị , Luu[i+1] cị

Ta tính từ dới lên , tức tính Luu[i] với i:=n D[i+1] cũ bị ghi đè Và lúc dùng tg để lu lại

Thủ tục quy hoạch động nh sau : procedure qhd;

begin

for j:=1 to n begin

luu[j]:=1; tg:=0;

for i:=j-1 downto begin

t:=luu[i];

if s[i]=s[j] then luu[i]:=tg+2 else Luu[i]:=max(Luu[i],Luu[i+1]);

tg:=t; end;

end; end;

Nh số ký tự cần thêm vào : N-Luu[1]

Bài toán 17 : Sign

Đề Bài :

Giỏm c mt cụng ti trỏch nhiệm hữu hạn muốn xin chữ kí ơng kiến trúc s trởng thành phố phê duyệt dự án xây dựng trụ sở làm việc công ty ông kiến trúc s trởng ký vào giấy phép bà th ký ông ta ký duyệt vào giấy phép Bà th kí làm việc tầng thứ M nhà đợc đánh số từ đến M , từ thấp lên cao Mỗi tầng tồ nhà có N phịng đợc đánh số từ đến N , từ trái sang phải Trong phịng có nhân viên làm việc Giấy phép bà th kí ký duyệt có nhân viên tầng tồ nhà kí xác nhận Một nhân viên kí xác nhận vào giấy phép có điều kiện sau đợc thoả mãn :

 Nhân viên làm việc tầng

 Giấy phép đợc kí xác nhận nhân viên làm việc phòng liền kề ( hai phòng đợc gọi liền kề số phòng sai khác đơn vị )

 Giấy phép đợc ký xác nhận nhân viên làm việc phòng số phòng tầng dới

Mỗi nhân viên kí xác nhận phải có chi phí định cách xin chữ kí cho xin đợc chữ kí ơng kiến trúc s trởng mà chi phí bỏ

(19)

Dòng ghi M , N ( <= M <=100 ; 1<=N<=500) ;

 Dòng thứ i số M dòng ghi N số biểu diễn chi phí phải kí phịng ( Cij<=109 )

( Tổng chi phí cần trả 109 )

KÕt qu¶ : Ghi file : Sign.Out nh sau :

Dòng ghi hai số F , K theo thứ tự chi phí cần trả số lợng phòng cần qua

Các dòng ghi số phòng theo thứ tự cần qua , số ghi

dòng Ví Dụ :

Sign.Inp Sign.Out

3 10 10 10 2 10 10 10 10 3 Híng DÉn :

Bài Tốn thực chất Bài Toán gián từ ô ô để đến ô hàng cuối với chi phí nhỏ

Gọi Mind[i,j] số tiền để đến ô (i,j)

Ta cã :

Mind[i,j]:=MinMind[i-1,j];Mind[i,j-1];Mind[i,j+1] +C[i,j];

Nhng ta thÊy r»ng chơng trình ta có phải lu dới dạng mét m¶ng [100*500] Of

longint , thêm vào để lu lại đờng ta phải dùng biến lu toạ độ , mà nh liệu không đáp ứng đợc

Sau cách làm chơng trình đáp ứng đợc điều :

Type tang = Array [0 maxN] of Longint ;

tru = Array [0 maxN] of Integer ;

tr = Array [0 maxM] of ^tru ;

Var C ,Mind : Array [0 maxM] of ^tang ;

try ,trx : tr ; Procedure Quy Hoạch Động ;

Begin

new(d[1]) ; new(trx[1]) ; new(try[1]) ; Fillchar(trx[1]^ ,sizeof(trx[1]^) ,0) ; Fillchar(try[1]^ ,sizeof(try[1]^) ,0) ;

For i := to N Mind[1]^[i] := c[1]^[i] ; For u := to M

Begin

(20)

Begin

Mind[u]^[i] := Mind[u-1]^[i]+c[u]^[i]; trx[u]^[i] := u-1 ;try[u]^[i] := i;

End ;

For i := to N-1

If Mind[u]^[i]+c[u]^[i+1] < Mind[u]^[i+1] then

Begin

Mind[u]^[i+1] := Mind[u]^[i] + c[u]^[i+1];

trx[u]^[i+1] := u ;try[u]^[i+1] := i;

End ;

For i := N downto

If Mind[u]^[i]+c[u]^[i-1] < Mind[u]^[i-1] then

Begin

Mind[u]^[i-1] := Mind[u]^[i] + c[u]^[i-1] ;

trx[u]^[i-1] := u ;try[u]^[i-1] := i;

End ;

dispose(c[u-1]) ;dispose(Mind[u-1]) ; End ;

Chúng ta thấy liệu đợc đóng mở cách khéo léo mà khơng tốn nhớ Còn ta quan tâm đến kết cuối Mind[m]^ Cịn đờng đợc lu hai bảng Trx Try Chính

chúng ta đóng Mind[i] mà khơng dùng đến q trình quy hoạch sau ( Cũng đóng ln mảng C [i] không cần thiết ) Với cách giải thông minh nh , bạn hoàn toàn giải nhiều tốn quy hoạch động địi hỏi nhiều b nh khỏc

Bài toán 18 : RTicket

Đề Bài :

Trờn tuyn ng st t thành phố A đến thành phố B qua số ga Tuyến đờng biểu diễn đoạn thẳng ,các nhà ga điểm Tuyến đờng A (có số hiệu ) B ga cuối

Giá vé lại hai nhà ga phụ thuộc vào khoảng cách chúng Cách tính giá vé đợc cho bảng sau:

Khoảng cách hai nhà ga -X

Gi¸ vÐ

(21)

Ví dụ , tuyến đờng sắt cho đoạn thẳng sau :

Ga:

L1

L2 L3

Để từ ga đến ga mua vé thẳng Có nhiều cách đặt mua vé để từ ga đến ga Chẳng hạn, đặt mua vé từ ga đến ga chi phí C2 sau mua vé từ ga đến ga chi phí C3 chi phí tổng cộng để đặt mua vé từ ga đến ga theo cách C2+C3 Lu ý khoảng cách từ ga đến ga 2*L2 nhng đặt mua vé với giá vé để từ ga đến ga 2*C2vì vé có giá trị lại hai ga

Yêu Cầu: Tìm cách đặt mua vé để lại hai nhà ga cho trớc với chi phí mua vé nhỏ Dữ Liệu: Vào từ file văn Rticket.Inp :

 Dòng ghi số nguyên L1,L2,L,C1,C2,C3 (1 L1< L2<L3 109,1 C1<C2<C3 109 ) theo thứ tự vừa liệt kê

 Dòng thứ hai chứa số lợng nhà ga N (2 N 10000) Dòng thứ ba ghi hai số nguyên S,T số

ca hai nh ga cần tìm đặt mua vé với chi phí nhỏ để lại chúng

 Dßng thø i số N-1 dòng lại ghi số

nguyờn khoảng cách từ nhà ga A (ga 1) đến nhà ga thứ i+1 (i=1,2, N-1) Chi phí tù nhà ga A đến nhà ga cuối B không vợt 109

Kết Quả : Ghi file Rticket.Out chi phí nhỏ tìm đợc

VÝ Dô:

RTICKET.INP RTICKET.OUT

20 30 40

13 15 23 70

Híng DÉn :

Tuy cơng thức truy hồi toán đơn giản , nh công thức truy hồi toán trớc , nhng liệu toán lớn Chính vịng lặp quy hoạch động trở nên phải áp dụng toán việc so sách với ga gần có

khoảng cách nhỏ L1,L2,L3 cơng đoạn tốn đợc mơ ta nh sau :

(22)

readln(f1, l1, l2, l3, c1, c2, c3); readln(f1, n);

readln(f1, x1, x2); if (x1<x2) then

begin

i:=x1; j:=x2; end

else begin

i:=x2; j:=x1; end;

x1 := i; x2 := j; A^[1] := 0;

for i:=2 to n begin

readln(f1,t); a^[i]:=t; end;

End;

Procedure Xuli; Begin

i1 := x1; i2 := x1; i3 := x1;

for i:=x1+1 to x2 begin

while (A^[i]-A^[i1])>l1 inc(i1); while (A^[i]-A^[i2])>l2 inc(i2); while (A^[i]-A^[i3])>l3 inc(i3); B^[i] := B^[i3] + c3;

if (i<>i2) then

if (B^[i2]+c2)<B^[i] then B^[i] := B^[i2] + c2;

if (i<>i1) then

if (B^[i1]+c1)<B^[i] then B^[i] := B^[i1] + c1;

end;

IV Các Bài toán Khác :

Bài toán 19 : RoBot1

Đề Bài :

Để thám hiểm , khảo sát vùng đất nguy hiểm trái đất , ngời ta chế tạo RoBốt đơn giản , hoat động theo chơng trình cài sẵn theo lệnh điều khiển phát từ Trái Đất Các lệnh điều

(23)

nguyên Ban đầu rơbốt đợc đa tới điểm có toạ độ (X0,Y0) hớng theo chiều song song với trục toạ độ Nhiệm vụ phải đa rôbốt tới điểm có toạ độ (X1,Y1) K lệnh di chuyển ( 0<=| X0-X1| ,|Y0-Y1|<=16,0<K<=16) Hãy xác định xem tồn chơng trình khác cài đặt vào nhớ rơbốt

D÷ LiƯu : Vào từ file văn : Bai18.Inp gồm số nguyên K,X0,Y0,X1,Y1 số thuộc phạm vi

Integer , c¸ch Ýt nhÊt mét dÊu c¸ch

Kết Quả : Ghi file văn : Bai18.Out số nguyên xác định số lợng chơng trình tìm đợc

VÝ Dô:

BAI18.INP BAI18.OUT

0

Híng DÉn :

Chúng ta thấy để đến (i,j) có từ đến : ( i,j+1) , (i,j-1) , (i-1,j) , (i+1,j)

Gọi Count[i,j,k] số cách để đến (i,j) từ xuất phát (x0,y0) sau k bớc

Ta sÏ cã :

Count [i,j,k]:= Count[i , j-1 , k-1 ] + Count[i , j+1 , k-1] + Count[i-1 , j , k-1 ] +

Count [i +1 , j , k - 1];

Nhng để tránh trùng lặp nên phải xuất phát đặc biệt : cho i , j chạy từ (xo,yo) sau k bớc , sau lại cho (i,j) chạy từ (xo,yo) v trc

Bài toán 20 : RoBot2

Đề Bài :

Mt xng sn xut cú mặt hình chữ nhật kích thớc M x N , M , N số nguyên dơng không lớn 100 Mặt đợc chia thành vng đơn vị gồm dịng đánh số từ đến M từ xuống dới cột đợc đánh số từ đến N đánh số từ trái sáng phải Cuối ca làm việc , để thu gom sản phẩm , ngời ta dùng số robot phải xuất phát từ ô [1,1] robot chuyển động từ trái sang phải , xuống Khi robot đến nơi đặt máy , thu hết sản phẩm máy Robot kết thúc hành trình ô [ M,N]

Yêu Cầu : Hãy bố trí số robot để thu gom sản phẩm

Dữ Liệu : Nhập vào từ file Robot.inp địng thứ ghi hai số M , N Tiếp theo M dịng mơ tả mặt xởng ,mỗi dòng ghi N số gồm số / mà có nghĩa tơng ứng khơng có máy , ngợc lại ghi số

(24)

D , R : D có nghĩa xuống , R có nghĩa sang phải

Ví dụ :

Robot.Inp Robot.Out

10 12 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 DDDDDDDDDRRRRRRRRRRR RDDDDDDDRRRRRRRRDDRR

RRRRRDDDDDDRRRRRRDDD RRRDDDDRRRRRRRRRDDDD RRRRRRRDDDDDDDDDDRRR

Híng DÉn :

Gọi cc số Robot cần dùng Dùng mảng p[i,j] để lu lại giá trị Ta có xét với hàng i , ta có bớc sau :

 FillChar(P, SizeOf(P), 0);  cc:=0 ;

 Víi hµng i :

+ bớc i: Ta tìm vị trí cuối hàng có chứa máy cần thu gom ( kí hiƯu mm

) Nếu khơng có quy định : Ok:=False có Ok:=True ;

+ bớc ii : Xét vị trí hàng theo thứ tự giảm dần cột ( j )

NÕu P[i-1,j]>0 th× :

NÕu j <= mm th× : P[i,mm]:=P[i-1,j]; Ok:=False ;thùc hiƯn tiÕp bíc i

NÕu j>mm th× : P[i,j]:=P[i-1,j]

NÕu cuèi cïng mà Ok:=True cc:=cc+1 ; tức tăng số robot lªn mét

 Cứ nh thực đợc số robot nht cn dựng

Bài toán 21 : Truyền Tin

( §Ị Thi häc sinh giỏi quốc gia 2000-2001-bảng B )

Đề Bài :

Ngời ta cần truyền n gói tin đợc đánh số từ đến n từ điểm phát đến điểm thu Để thực việc truyền tin sử dụng m đờng truyền đợc đánh số từ đến m Biết truyền j gói tin theo đờng truyền tin i phải trả Sij

( Sij số nguyên dơng , Sij 32767 , i=1,2 m , j=1,2 n )

Yêu Cầu : Hãy xác định số lợng gói tin cần truyền theo đờng truyền tin để việc truyền tin n gói tin đợc thực với tổng chi phí phải trả nhỏ

D÷ LiƯu : Vµo tõ file Bl3.Inp nh sau :

(25)

 Dßng thø i sè m dßng chứa n số nguyên dơng Si1,Si2, Sin ,i=1,2 m

Kết Qủa : Đa file văn Bl3.Out nh sau:

 Dòng chứa số S tổng chi phí phải trả theo cách truyền tin tìm đợc

 Dịng thứ hai chứa m số ngun khơng âm Q1,Q2 Qm , Qi số gói tin cần truyền theo đờng truyền i

VÝ Dô:

Bl3.Inp Bl3.Out

3 20 20 20 10 20

0

Híng DÉn :

Gọi Mind[i,j] tổng chi phí nhỏ cần trả cho việc truyền i gói tin mà sử dụng j đờng tin ( 1,,j), Chúng ta có cơng thức truy hồi nh sau :

Mind[i,j]:=MinMind[i-1,k]+S[i,j-k]; K=0, j ; Bài toán 22 : Cửa Hàng Bán Hoa Đề Bài :

Tại cửa hàng ngời ta muốn cắm số loài hoa vào chậu hoa nhỏ , tất có F lồi hoa V chậu hoa (F<=V) Các chậu hoa đợc đánh số từ đến V xếp theo thứ tự từ trái sang phải Mỗi loài hoa đợc đánh số tuân theo điều kiện : với i<j , loại hoa i phải phía trái loại hoa j , hay nói cách khác hoa i đợc cắm chậu Vi hoa j đợc cắm chậu Vj ta phải có Vi<Vj

Ta cã b¶ng hƯ sè thÈm mü cđa viƯc c¾m hoa :

ChËu Hoa

4

HOA (đỗ quyên ) 23

-5 -24 16

2 ( hải đờng) 21 -4

10 23

3( cÈm chíng) -21

-4 -20 20

bảng Ai,j với 1<=i<=F , 1<=j<=V có ý nghĩa : hoa i đợc cắm chậu j đạt điểm thẩm mỹ ại ví dụ ta có bảng hệ số

Yêu cầu toán tìm phơng án camứ hoa cho đạt tổng số điểm lớn

H¹n chÕ kü thuËt :

1<= F<=100 với F số loµi hoa  F<=V <=100 víi V lµ sè c¸c chËu hoa

 -50<= Ai,j <=50 với Ai,j hệ số thẩm mỹ thu đợc loài hoa i cắm vào chậu hoa j

(26)

F dòng : dòng ghi V số nguyên , nh số Ai,j ghi vị trí j dòng i+1

Kết Qu¶ : Ghi file Bai22.Out nh sau :

Dòng ghi tổng số điểm thẩm mỹ cđa c¸ch xÕp

 Dịng thứ ghi lần lợt F số , số thứ K ghi số chậu hoa loài hoa thứ k xếp

Yêu cầu chạy không giây Ví dụ :

Bai22.Inp Bai22.Out

3 23 -5 -24 16 21 -4 10 23 -21 -4 -20 20 5

Híng DÉn :

Chúng ta có Maxd[i,j] giá trị thẩm mĩ lớn cắm tranh từ đến i vào vị trí j Ta có cơng thức truy hồi nh sau :

 i<= j then Maxd[i,j]:=MaxMaxd[i-1,j-1]+A[i,j] , Maxd[i,j-1]

 i>j then Maxd[i,j]:=Maxd[i-1,j] ;

Bài toán 23 : Treo Tranh

Đề Bài :

Cho n bc tranh mó số từ đến n , không vợt 50 Ngời ta cần chọn tranh để đặt cửa vào phòng tranh , số lại đợc treo thẳng hàng phòng treo theo trật tự nghiêm ngặt sau : tranh có số hiệu nhỏ phải treo trái tranh có số hiệu lớn Biết thông tin sau tranh :

 Tranh thứ i tro đạt giá trị thẩm mỹ C[i]

 Tranh thứ i treo vị trí thứ j đạt giá trị thẩm mỹ V[i,j]

Hãy xác định phuơng án treo tranh để có giá trị thẩm mỹ l ln nht

Dữ Liệu : Vào từ file văn : TRANH.INP - Dòng thứ : hai trị số : N , M Dòng n giá trị C

Tiếp theo N dòng , dòng thứ i gồm m sè V[i,1], V[i,2], V[i,m]

KÕt Qu¶ Ra tƯp văn : TRANH.OUT

- Dũng th nht : giá trị thẩm mỹ lớn tìm đợc

 Dßng thø hai : m· hiƯu bøc tranh treo ë cưa phßng tranh

 Từ dịng thứ ba : N - số tự nhiên số hiệu vị trí đợc chọn để treo tranh phịng

VÝ Dô :

TRANH.INP TRANH.OUT

40 20

1 10

(27)

2 2

10 40 2

Híng DÉn :

Trớc tiên xét toán : Cho N tranh , treo vào M vị trí , biết giá trị A[i,j] giá trị thẩm mĩ cách treo tranh thứ i vào vị trí thứ j Biết quy định treo nh quy định tốn Chúng ta có Maxd[i,j] giá trị thẩm mĩ lớn cắm tranh từ đến i vào vị trí j Ta có cơng thức truy hồi nh sau :

 i<= j then Maxd[i,j]:=MaxMaxd[i-1,j-1]+A[i,j] , Maxd[i,j-1]

 i>j then Maxd[i,j]:=Maxd[i-1,j] ;

áp dụng vào toán : thử tranh để cửa , sau giải cho toán N-1 tranh để vào M vị trí để có giá trị thẩm mĩ lớn Trong trờng hợp nh lấy trờng hợp có tổng giá trị thẩm mĩ lớn Chính cách treo tranh cần đặt

Bài toán 24 : Project

Đề Bài :

Giám đốc điều hành công ti tin học cần xác định số lợng nhân công cần sử dụng tháng để thực dự án phát triển tin học Ông giám đốc nắm đợc số lợng nhân công tối thiểu cho tháng Mỗi lần thuê sa thải công nhân thêm khoản chi phí Mỗi thợ đợc th , ln nhận đợc tiền lơng làm việc Giám đốc nắm đợc chi phí thuê cơng nhân , chi phí sa thải nhân công , lơng tháng công nhân vấn đề đặt cho giám đốc phải xác định số lợng công nhân cần thuê sa thải tháng chi phí thực dự ỏn l ti thiu

Dữ Liệu : Vào từ file văn Project.Inp : Dòng thứ ghi thêi gian thùc hiƯn dù ¸n n

( đơn vị thời gian : số tháng , n <=12 )

 Dòng thứ hai ghi ba số nguyên dơng theo thứ tự chi phí th cơng nhân , lơng tháng công nhân , chi phí để sa thải nhân

c«ng

Dòng cuối ghi n số nguyên dơng D1 ,

D2 , Dn Di số lợng nhân công tối thiểu cần cho tháng i

KÕt Qu¶ : Ghi file : Project.Out :

 Dßng thø nhÊt ghi chi phÝ tèi thiểu cần cho công việc

(28)

ca dự án , Si = khong có biến động sa thải hay thuê thêm

VÝ Dô :

PROJECT.INP PROJECT.OUT

3 199

4 10

10 11

1 Híng DÉn :

Gọi T_max số cơng nhân tháng nhiều công nhân mảng Scn[1 T] cho biết số công nhân tối thiểu cần cho tháng C[T,T_max] ,trong C[i,j]cho biết chi phí tối thiểu i tháng dự án tháng thứ i có j cơng nhân biên chế

C[i,j]:=minc[i-1,k]+chi phí để từ k ngời thành j ngời , i =1, T,j=Scn[i] T_max , k = scn[i-1] T_max

Bài toán 25 : Triangle

Đề Bµi :

7

4

Hình mộ bảng tam giác số ngun khơng âm Hãy viết chơng trình để tính tổng lớn số đờng từ đỉnh tam giác kết thúc điểm đáy tam giác

+ Mỗi nớc ta đợc quyền thẳng xuống bên trái hay bên phải số

+ Sè hµng tam giác lớn 100

+ Cỏc số tam giác số nguyên không âm nhỏ 100

D÷ LiƯu: cho file triangle.Inp nh sau: Dòng ghi số lợng dòng tam giác

( N )

 Dßng i+1 ( i N) ghi i sè

Kết Quả xuất file triangle.Out tổng lớn tìm đợc

VÝ Dơ:

Triangle.Inp triangle.Out Triangle.Inp Triangle.Out

5 8 4 30

10 8 4 5 7 8 5

4 3 58

Híng DÉn :

Maxd[i,j] độ dài lớn từ ơ[1,1] đến ơ[i,j] Ta có cơng thức truy hồi sau :

(29)

Trong ú maxd[1,1]:=a[1,1] ;

Bài toán 26 : Mua hàng

Đề :

N hng nc ngoi ( nớc đợc ghé nhiều lần ) ngời ta quay nớc , bán tất hàng thu đợc nhiều tiền ( Làn mua cuối nớc xem nh lần K+1 )

Dữ Liệu : Cho file văn Muahang.Inp gồm M+1 dòng :

Dòng gồm số M,N,S,K

Dòng thứ i+1 hàng còng lại ghi N số C[i,1],C[i,2], C[i,n

Kết Quả: ghi file văn Muahang.Out gồm :

 Dòng : tổng số tiền thu đợc theo phơng án tối u  Các dòng lại biểu diễn cách mua tối u:

+ Dòng ghi tên đơn vị hàng mua nớc 1, số lợng

+ k Dòng tiếp , dòng ghi số : tên nớc bán cần bán hàng trớc cần tiêu thụ mua tiếp , tên hàng mua nớc ,số lợng mua nớc

VÝ Dô:

Muahang.Inp Muahang.Out

10 100 5 5 5 5 1 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 5 187500 100 500 1 2500 12500 62500

Híng DÊn :

Gäi Maxd[i,j,k] lµ sè hàng i tối đa mua nớc j sau k lần mua bán ( S0,K0 số tiền ban đầu , số lần bán mua )

Maxd[i,j,k]:= maxMaxd[i , t ,k-1]

Số tiền tối đa bạn kiếm đợc sau K0 lần mua bán MaxMaxd[i,j,k0] ; i=1, M , j =1, N

Nhng công thứ truy hồi , tốn địi hỏi nhớ lớn Chúng ta thực nh sau để giảm tối thiu b nh :

Gọi S mảng cho S[i,j] số hàng i tối đa mua nớc j

Gán toàn S = ;

 S[1,i]:=S0 div C[1,i] ;  For k := to K0

Begin

+ G¸n toµn bé S2=0 + For i :=1 to m

for j:=1 to n

for i1:=1 to m if (i1<>i) then for j1:=1 to n

if ( j1<>j) then

(30)

th× S2[i,j]:=S[i1,j1]*c[i,j1] div c[i,j] ;

+ S := S2 ; End ;

Bài Toán 27 : Mua Ximăng

Đề Bài :

Mt tng cụng ti xõy dng nhận thầu cơng trình Ngời ta dự kiến chia cơng trình thành N cơng đoạn ,mỗi cơng đoạn kéo dài tháng Lợng xi măng cần thiết cho công đoạn thứ i Mi ( Mi nguyên dơng ) Vì xi măng tồn kho cần phải trả chi phí tổn thất định nên ngời ta không mua đủ lợng xi măng cho cơng trình từ đầu mà chia thành nhiều đợt ,mua vào đầu tháng Tuy ,do giá xi măng thay đổi theo tháng nên không thiết tháng phải mua số lợng xi măng cho tháng

Yêu Cầu : Hãy cho biết số lợng xi măng cần mua cho tháng để phí tổn tổng cộng ( mua bảo quản ) Biết gía xi măng cho tháng thứ i Ci ( trăm ngàn đồng ) Ngoài , số lợng xi măng tháng cịn thừa kho d chi phí bảo quản tháng q*(d^2) ( trăm ngàn đồng ) Để đơn giản ,ta quy ớc đơn vị mua xi măng nhỏ tham số ngun

D÷ LiƯu : vào từ file văn ximang.Inp với : Dòng chứa n,q(n 10)

Dòng thứ hai chứa n giá trị : m1,m2, Mn (Mi <= 30);

Dòng thứ ba chứa n gía trị : C1,C2, Cn Kết Quả : ghi file văn Ximang.Out với : Dòng chứa S phí tổn tối u

Dòng thứ hai ghi n gía trị X1,X2, Xn lợng xi măng cần mua tháng

Ví Dụ:

XimangInp Ximang.Out

10 14 20 10 30 356

6 15

Híng DÉn :

Gọi A[i,j] lợng chi phí bỏ để mua bảo quản từ tháng thứ i cho hết N tháng , với lợng xi măng có kho j Ta có cơng thức truy hồi nh sau ( A[i,j]) :

For i := n downto begin

T := M[i]+M[i+1]+ +M[n] For j:=0 to T

begin

if i = n then

begin a[i,j]:=c[n]*(m[n]-j) ; k := m[n]-j ; end

(31)

begin a[i,j]:=Sqr(j-m[i])+a[i+1,j-m[i]] ; k := ; end

else

begin a[i,j]:=(m[i]-j)*c[i]+a[i+1,0] ; k:= m[i]-j ; end ;

A[i,j]:=Minx*c[i]+sqr(j+x-m[i])*q+a[i+1,j+x-m[i]] ;

x := k + , T end ;

end ;

Bài Toán 28: Cung Cấp Vật Liệu Đề Bài :

Cú N cơng trình cần vật liệu thi cơng Cơng trờng i cần cung cấp D[i] đơn vị hàng Hàng đợc cung cấp từ hai kho A B Cớc vận chuyển đơn vị hàng từ kho A đến công trờng i A[i] Cớc vận chuyển từ đơn vị hàng từ kho B đến công trờng i B[i] Biết A có r đơn vị hàng tổng số hàng hai kho vừa đủ cung cấp cho N công trờng Yêu Cầu : Hãy phân phối hàng từ hai kho đến công trờng cho tổng cớc phí vận chuyển nhỏ

D÷ LiƯu: Cho file CungCap.Inp gåm dòng : Dòng thứ ghi N R (N 100)

 Dßng thø hai ghi N sè biĨu diƠn D[1],D[2], D[n]

 Dßng thø ba ghi N sè : A[1],A[2], A[n]  Dßng cuèi cïng ghi N sè : B[1],B[2], B[n] KÕt Qña : xuÊt file Cungcap.Out nh sau :

 Dßng 1: ghi số nguyên dơng tổng chi phí vận chuyển Ýt nhÊt

 Dòng 2: Ghi N số nguyên dơng tơng ứng số đơn vị hàng mà A cung cấp cho cơng trình theo thứ tự

 Dòng 3:Ghi N số nguyên dơng tơng ứng số đơn vị hàng mà B cung cấp cho công trờng theo thứ tự

VÝ Dô:

Cungcap.Inp Cungcap.Out

100 30 80 80 50 40 10 23 1070 30 20 50 0 60 80 40

Híng DÉn :

Gọi Mind[i,j] cớc phí nhỏ mà kho phải cung cấp j đơn vị hàng cho công trờng i

Ta sÏ cã c«ng thøc truy håi :

Mind [i,j]:=MinA[i]*K+B[i]*(D[i]-K)+Mind[i-1] (j-K)

Víi K=0 D[i] ; vµ K<=j ;

(32)

Đề Bài :

Trong cửa hàng ,mỗi loại hàng có giá Ví dụ gía bơng hoa đồng giá bình đồng Để thu hút nhiều khách hàng ,cửa hàng đề số cách bán đặc biệt

Một cách bán giá đặc biệt liên quan đến việc bán hay số hàng với giá chung đợc giảm Ví dụ : bơng hoa bán với giá đồng thay đồng

bình bơng hoa bán với giá 10 đồng thay 12 đồng

Viết chơng trình tính khách hàng phải trả cho nhu cầu mua hàng để tận dụng cách tối u cách bán đặc biệt ,nghĩa phải trả Ví dụ : với giá cách bán đặc biệt , nêu , giá thấp để mua bơng hoa bình 14 đồng ; bình hoa 10 đồng ; hoa với giá bình thờng đồng

D÷ LiƯu: cho file offer.In1 vµ Bai24.In2 nh sau:

File thứ Bai24.Inp mô tả nhu cầu mua :

Dòng chứa số B số loại hàng cần mua (0 B 5)

 Mỗi dòng B dòng ghi số c,k,p Giá trị c mã loại hàng (1 c 999) Giá trị k số đơn vị hàng cần mua với mã c ( 1k 5) Giá trị p giá bình thờng đơn vị hàng với mã c (1 p 999)

File thứ hai offer.In2 mô tả cách mua bán đặc biệt:

 Dòng chứa số s số cách bán đặc biệt (0 s 99)

 Mỗi dịng s mơ tả cách bán đặc biệt Số n dòng nh số loại hàng cách bán đặc biệt tơng ứng với dịng (1 n 5); n cặp số (c,k) c mã loại hàng, k số đơn vị hàng (1 k 5;1 c 999 ) Số p cuối dòng giá đợc giảm lô hàng Giá đợc giảm nhỏ tổng giá trị bình thờng

Kết Qủa :xuất file offer.Out số tiền nhỏ để mua hng

Biết hàng tiền phải nguyªn VÝ Dơ:

offer.In1 offer.In2 offer.Out

3 10 4 2 20

2 10 9 1 10 56 Híng DÉn :

(33)

chức việc mua đợc hình dung nh trình quy hoạch nhiều giai đoạn Nếu ký hiệu A[i1, i2, i3, i4, i5] tổng giá mua thấp để mua loại hàng với số lợng tơng ứng i1, i2, i3, i4, i5 theo quy hoạch động, phải nhỏ giá trị có A[j1, j2, j3, j4, j5]+giá mua theo giá gốc/giá mua theo cách mua đặc biệt phần hàng hoá thêm với j1, j2, j3, j4, j5 <= i1, i2, i3, i4, i5 Mỗi cách tính tốn thể hin bi mt th tc TIM1/TIM2

Sau Chơng trình giai thích chơng trình tiếng việt :

Uses crt; Const

fn='input.txt'; fn1='offer.txt'; gn='output.txt'; Type

mang=array[1 5] of record vat,sl:integer; end;

{Kiểu liệu để ghi nhận loại hàng số lợng cách bán đặc biệt}

Var

ten,sl,gt:array[1 5] of integer; {Ghi nhËn mét yêu cầu mua}

num:array[1 100] of integer; c:array[1 100] of mang;

cost:array[1 100] of integer;

{Ba mảng NUM, C, COST dùng để ghi nhận cách bán đặc biệt}

b:array[1 100] of boolean;

{Dùng để ghi nhận cách bán đặc biệt dùng đợc, cách bán đặc biệt dùng đợc có mặt hàng khơng xuất yêu cầu mua, ta cho giá trị b[i] tơng ứng FALSE} a:array[0 5,0 5,0 5,0 5,0 5] of longint; {A[i1, i2, i3, i4, i5] ghi nhận giá thấp (qua bớc) để thực yêu cầu mua hàng với số lợng mặt hàng tơng ứng i1, i2, i3, i4, i5} cs,d:array[1 5] of byte;

{CS D dùng để ghi nhận mức trình tìm cách mua thấp nhất; trình chọn cách mua xem nh trình nhiều giai đoạn, ý tởng dùng quy hoạch động đợc thể qua thủ tục TINH1 TINH2 sau này}

m,n:byte;

{M: số cách bán đặc biệt; N: số mặt hàng cần mua} procedure nhap;

var

f:text;

i,j:integer; begin

(34)

for i:=1 to n

readln(f,ten[i],sl[i],gt[i]); close(f);

assign(f,fn1); reset(f);

readln(f,m); for i:=1 to m begin

read(f,num[i]);

for j:=1 to num[i] read(f,c[i,j].vat,c[i,j].sl); readln(f,cost[i]); end;

close(f); end;

function tim(x:integer):byte;

{Hàm TIM(X) mặt hàng X không xuất yêu cầu mua hàng, i mặt hàng X mặt hàng thứ i yêu cầu mua hàng, hàm dùng để khởi tạo mảng B nói thủ tục KHOITAO tiếp theo}

var

i:integer; begin

for i:=1 to n if ten[i]=x then begin

tim:=i; exit; end; tim:=0; end;

procedure khoitao;

{Thủ tục gồm hai phần, phần thứ nhằm làm cho yêu cầu mua có mặt hàng, thủ pháp làm cho việc viết trình đơn giản; phần thứ hai nhằm ghi nhận cách bán đặc biệt sử dụng đợc để thực yêu cầu mua cho}

var

i,j,k:integer; ab:mang;

begin

if n<5 then begin

for i:=n+1 to begin

ten[i]:=0; sl[i]:=0; gt[i]:=0; end;

n:=5; end;

for i:=1 to m begin

b[i]:=true; ab:=c[i];

(35)

begin

c[i,j].vat:=0; c[i,j].sl:=0; end;

for j:=1 to num[i] if b[i] then

begin

k:=tim(ab[j].vat);

if k=0 then b[i]:=false else begin

c[i,k].vat:=ab[j].vat; c[i,k].sl:=ab[j].sl; end;

end; end;

end;

procedure tinh1;

{So sánh việc mua theo giá gốc với việc mua theo phơng án mua thấp có với số lợng mặt hàng "ít hơn" việc mua thêm hàng dùng giá gốc}

var

s,i,min,j:longint; begin

s:=0;

for i:=1 to s:=s+gt[i]*cs[i]; min:=s;

for i:=1 to begin

for j:=1 to d[j]:=0; for j:=1 to cs[i]

begin

d[i]:=j;

s:=a[cs[1]-d[1],cs[2]-d[2],cs[3]-d[3], cs[4]-d[4],cs[5]-d[5]]+gt[i]*j;

if s<min then min:=s; end;

end;

a[cs[1],cs[2],cs[3],cs[4],cs[5]]:=min; end;

procedure tinh2;

{So sánh việc mua theo giá sau bớc TINH1 với việc mua theo phơng án mua thấp có với số lợng mặt hàng "ít hơn" việc mua thêm hàng dùng cách bán đặc biệt dùng đợc}

var

min,s,h°^d×D ]];

for i:=1 to m

if b[i] and (cs[1]>=c[i,1].sl) and (cs[2]>=c[i,2].sl) and

(cs[3]>=c[i,3].sl) and (cs[4]>=c[i,4].sl) and (cs[5]>=c[i,5].sl) then

(36)

s:=a[cs[1]-c[i,1].sl,cs[2]-c[i,2].sl,cs[3]-c[i,3].sl,

cs[4]-c[i,4].sl,cs[5]-c[i,5].sl]+ cost[i]; if s<min then min:=s;

end;

a[cs[1],cs[2],cs[3],cs[4],cs[5]]:=min; end;

procedure xuly; var

g:text; begin

khoitao;

a[0,0,0,0,0]:=0;

for cs[1]:=0 to sl[1] for cs[2]:=0 to sl[2] for cs[3]:=0 to sl[3] for cs[4]:=0 to sl[4] for cs[5]:=0 to sl[5] begin

tinh1; tinh2; end; assign(g,gn); rewrite(g);

writeln(g,a[sl[1],sl[2],sl[3],sl[4],sl[5]]); close(g);

end; Begin nhap; xuly; End

Bài Toán 30: Con Dế

Đề Bài :

Giả sử có khối đất sét hình lập phơng cạnh n (n 30) đơn vị đợc chia thành khối lập phơng đơn vị mặt có đờng hầm vng góc với mặt với chiều sâu số nguyên dơng Hình lập phơng đặt hệ trục toạ độ vng góc Oxyz cho đỉnh gốc toạ độ O ,các trục toạ độ trùng với ba cạnh hình xuất phát từ O Hình lập phơng nằm góc phần tám (X0, Y 0, Z 0)

Câu1 : Biết toạ độ điểm mặt khối đất ,từ dế chui vào , bị theo đờng hầm ,rồi chui điểm mặt đối diện Dế theo đờng ngắn nhât Hãy đờng dế độ dài đờng

(37)

Hãy cho biết đờng mà dế ( kể đoạn khoan bổ sung )

D÷ LiƯu : vào từ file văn Bai25.Inp có cấu trúc nh sau:

Dòng ghi số nguyên d¬ng n,

 Dịng thứ hai ghi ba số nguyên không âm toạ độ điểm xuất phát

 Trong dịng ,mỗi dịng có bốn số nguyên , theo thứ tự toạ độ điểm đờng hầm độ sâu

KÕt Qu¶ : ghi file Bai25.Out theo cÊu tróc nh sau :

 Dịng ghi chữ CAU1 Hoặc CAU2 tuỳ theo việc dế không cần cần khoan thêm đờng hầm

 Dòng thứ hai ghi độ dài đờng ngắn ( kết câu 1) tổng độ dài đoạn cần khoan (nếu câu 2);

 Tiếp theo nhóm dịng ghi đờng dế theo quy cách nh sau: dòng thứ ghi toạ độ điểm xuất phát ,tiếp theo, trình tự đờng ghi dòng toạ độ điểm hành trình đổi hớng , dịng cuối ghi toạ độ điểm kết thúc

Híng DÉn :

Ta dùng thuật tốn Dijstra tìm đờng ngắn đồ thị từ đỉnh xuất phát đến đỉnh thuộc mặt đối diện Đồ thị có tập đỉnh đỉnh khối lập phơng đơn vị, nh có tất (N+1)3 đỉnh Tại đỉnh, dế chọn khơng q sáu di chuyển sang đỉnh kề theo cạnh nối hai đỉnh đó, hai đỉnh thuộc lỗ khoan, ta cho độ dài cạnh tơng ứng 1, không (tức dế phải khoan), ta cho độ dài cạnh tơng ứng 1000 Khi đó, độ dài đờng ngắn nhỏ 1000, ta kết luận dế chui đợc sang mặt đối diện mà không cần khoan thêm đờng hầm Nếu ngợc lại, ta kết luận dế cần khoan thêm đờng hầm tổng độ dài đờng hầm ngắn cần khoan thơng (nguyên) phép chia độ dài đờng ngắn cho 1000 Lời giải xin xem phần giải mu bit thờm

Bài toán 31 : Chiếu Kho Xăng Đề Bài :

(38)

Ai chi phí xây dựng đèn chiếu sáng dọc theo hàng i (i=1,2 m)

Bj chi phí xây dựng đèn chiếu sáng dọc theo cột j (j=1,2, n)

Yêu Cầu : Tìm cách xây dựng hệ thống đèn chiếu với tổng chi phí xây dng l nh nht

Dữ Liệu: Vào từ file Khoxang.Inp :

Dòng chứa ba số nguyên dơng m,n,k (m,n< 100) ;

Dũng th hai chứa m số nguyên dơng A1,A2, Am  Dòng thứ ba chứa n số nguyên dơng : B1,B2, Bn  Dòng thứ i số k dòng lại cha to

của bể xăng thứ i (i=1,2, k)

KÕt Qu¶ : ghi file Khoxang.Out nh sau :

 Dòng ghi tổng chi phí theo cách xây dựng tìm đợc

 Dịng thứ hai ghi hai số P Q theo thứ tự số lợng đèn chiếu dọc theo hàng cột ( ghi số khơng có )

 P+Q dòng lần lợt toạ độ hàng đến cột có đặt đèn chiếu ,mỗi dịng ghi số

VÝ Dơ:

Khoxang.Inp Khoxang.Out Khoxang.Inp Khoxang.Out

2 10 12 2 2 11 2

3 15 17 1 2

12 3 Híng DÉn :

Gäi Mind[i,j] lµ tỉng số chi phí cần dùng chiếu hình có kÝch thíc : i vµ j Ta sÏ cã c«ng thøc truy håi :

 NÕu C[i,j]=0 th× :

+ Nếu Cột j hàng i cha đợc chiếu : Mind[i,j]:=Mind[i-1,j-1]

+ Nếu Cột j đợc chiếu , hàng i cha đợc chiếu : Mind[i,j]:=Mind[i-1,j]

+ Nếu Cột j đợc chiếu , hàng i đợc chiếu : Mind[i,j]:=MinMind[i-1,j]+a[i],Mind[i,j-1]+b[j]

+ Nếu Cột j cha đợc chiếu , hàng i đợc chiếu : Mind[i,j]:=Mind[i,j-1];

 NÕu C[i,j]=1 th×

+ Nếu Cột j hàng i cha đợc chiếu : Mind[i,j]:=Mind[i-1,j-1]+MinA[i],B[j]

+ Nếu Không Mind[i,j]:=MinMind[i-1,j] +a[i],Mind[i,j-1]+B[j]

(39)

Bài toán 32 : Fish Đề Bài :

Cu tớ có ý định câu cá vùng có thời gian H ( tính theo đơn vị giờ) Có n hồ (lakes) mà cu tí có ý định câu đợc đánh số từ đến n theo thứ tự nằm đờng chiều cu tí từ hồ thứ i đến hồ thứ i+1 thời gian từ hồ i đến hồ i+1 Ti ( Ti chia hết cho 5) Tại hồ cu tí khơng thiết phải dừng lại để câu cá Nếu hết thời gian cu tí hồ cu tí phải quay nhà

Để có đợc chuyến câu hiệu cu tí thu nhập thông tin hồ Cho hồ i ,số cá mà cu tí câu đợc phút đầu Fi

(Fi>0) sau phút số cá đói giảm lợng Di Nếu nh số cá mà câu đợc phút trớc khơng lớn Di số câu đợc phút sau Hãy viết chơng trình giúp cu tí câu đợc nhiều cá Thời gian để cu tí câu cá hồ hoặc chia hết cho

Dữ Liệu : vào từ file Fish.Inp nh sau : Dòng số n h (n<=20,h<=16)

Dòng n-1 số thể cho T1,T2, Tn-1 Dòng n sè thĨ hiƯn cho F1,F2, Fn  Dßng ci cïng n số thể cho D1, Dn Kết Quả : ghi file Fish.Out

 Dòng số cá thu đợc

 Dòng gồm n số thể cho thời gian cu tí dừng lại câu cá hồ đến n

Híng DÉn :

Ta thấy tổng thời gian chạy qua ao cu tí không đổi Nh số lợng phụ thuộc vào thời gian vào ao cu tí mà

thåi Gäi thêi gian mµ cu tÝ

ghé vào ao Ta coi đoạn thêi gian lµ

khoảng mà cu tí dừng ao ( phút ) Nh khoảng phút thứ h1 ta dùng hàm Find (i : Integer ) hàm cho biết khoảng thời gian mà cu tí dừng lại ao thứ i ( sử dụng khaỏng thời gian để câu cá ) Các bạn xem chơng trình tốn sau :

Uses Crt;

Const Fi='Fish.Inp'; Fo='';

Var

Save,A,C,D,M,Sum,T:Array[1 20]Of LongInt; f:Text;

n,h,i:LongInt; Procedure ReadF; Begin

Assign(f,Fi); Reset(f);

(40)

For i:=1 to n-1

Begin Read(f,T[i]);T[i]:=T[i] Div 5;End; Sum[1]:=0;

For i:=2 to n Sum[i]:=Sum[i-1]+T[i-1]; For i:=1 to n Read(f,M[i]);

For i:=1 to n Read(f,D[i]); Close(f);

End;

Function Find(i:LongInt):LongInt; Var k:LongInt;

Max,l:LongInt; Begin

Max:=0; Find:=0;

For k:=1 to i

If M[k]-C[k]*D[k]>Max Then Begin Max:=M[k]-C[k]*D[k];l:=k;End;

Find:=l; End;

Procedure Solution;

Var h1,Max,K,Ca:LongInt; Begin

h:=h*12;Max:=0; For i:=1 to n Begin

FillChar(C,SizeOf(C),0); Ca:=0;

h1:=h-Sum[i]; Repeat

k:=Find(i);

If k=0 Then Break;

If M[k]-C[k]*D[k]>0 Then Inc(Ca,M[k]-C[k]*D[k]);

Inc(C[k]); h1:=h1-1; Until h1=0; If Ca>Max Then Begin

Max:=Ca; Save:=C; End;

End;

Writeln(Max); For i:=1 to n

Write(Save[i]*5:6); End;

BEGIN Clrscr; ReadF; Solution; END

Bài toán 33 : XÕp hµng mua vÐ xem biĨu diƠn - Ticket

(41)

Có N ngời hàng mua vé dự buổi hoà nhạc Ta đánh số họ từ đến N theo thứ tự đứng hàng Mỗi ngời cần mua vé , song ngời bán vé đợc phép bán cho ngời tối đa hai vé Vì ,một sơ ngời rời hàng nhờ ngời đứng trớc mua vé hộ Biết Ti thời gian cần thiết để ngời i mua xong vé cho Nếu ngời i+1 rời khỏi hàng nhờ ngời i mua vé hộ thời gian để ngời thứ i mua đợc vé cho hai ngời Ri

Yêu Cầu : Xách định xem ngời cần rời khỏi hàng nhờ ngời đứng trớc mua hộ vé để tổng thời gian phục vụ bán vé nhỏ

D÷ Liệu : vào từ file Ticket.Inp : Dòng chứa số N (1<N<2000)

Dòng thứ hai ghi n số nguyên dơng T1,T2, Tn Dòng thứ ba ghi n-1 số nguyên dơng R1,R2 Rn Kết Quả : ghi file văn Ticket.Out

Dòng ghi tổng thời gian phục vụ

Dòng ghi số khách hàng cần rời khỏi hàng ( Nếu cần rời khỏi hàng quy ớc ghi số )

VÝ Dô:

Ticket.INP Ticket.OUT Ticket.INP Ticket.OUT

5 4 10 10 18 4

50 50 50 50 24 Híng DÉn :

Gọi Mind[i] thời gian cần dùng để mua vé cho số ngời từ đến i ( theo lần lợt ) Ta có cơng thức truy hi :

Mind[i]:=MinMind[i-1]+T[i] ; Mind[i-2]+T[i-1] ;

Bài toán 34 : Monet

Đề Bài :

Trong cao ốc N tầng trụ sở nhà băng ( N <= 150 ) xảy hoả hoạn Hoả hoạn lan truyền với tốc độ tầng / phút Trong cao ốc có thang máy chuyển động với vận tốc 10 tầng / phút Nếu thang máy di chuyển qua tần có lử bốc cháy bốc cháy theo Tại thời điểm ban đầu bắt đầu hoả hoạn thang máy tầng thứ Với mục đích cứu tài sản q giá ( hịm với đơng tiền vàng ) đợc cất giữ số tầng cao ốc tất nhân viên nhà băng phải dời cao ốc cầu thang thang máy đợc dành cho nhiệm vụ cứu Biết vị trí tâng phát sinh hoả hoạn , tầng có chứa hịm số lợng đồng tiền vàng chúng thời gian để chuyển chúng vào thang máy 1,5 phút , bạn cần tìm cách cứu đợc lợng đồng tin ln nht

Dữ Liệu : Vào từ file văn : MONET.INP

(42)

 Dòng thứ i số N - dòng chứa số lợng đơng tiền vàng có hịm tầng thứ i + ( tầng1 khơng có ) Số lợng đồng tiền vàng tầng giả thiết số nguyên

Kết Quả : ghi dòng file văn : MONET.OUT số lợng tiền cứu đợc

VÝ Dô :

MONET.INP MONET.OUT

5 100

100 300 1000 Híng DÉn :

Hồn tồn tơng tự nội dung nh tốn Fish Thực toán đổi số liệu mà thụi

Bài toán 35 : Hanoitower

Đề Bµi :

Bài tốn tháp Hà Nội trở thành tiếng vào năm 1883 , sau báo Lucas nhà toán học ngời pháp Tháp cọc đĩa đờng kính giảm dần từ dới lên Bài toán đặt cần chuyển

chồng đĩa sang cọc khác sử dụng cọc trung gian cho q trình chuyển đĩa khơng có đĩa có đờng kính lớn lại bị đặt đĩa có đờng kính nhỏ

Yêu Cầu : giải toán tháp Hà Nội tổng quát : cho M cọc tháp gồm N đĩa ( <= M , N <= 30 ) , xác định số lần chuyển đĩa tối thiểu cần thực để chuyển chồng đĩa từ cọc xuất phát sang cọc đích sử dụng M-2 cọc cịn lại nh cọc trung

gian

Dữ liệu : vào từ file Hantower.Inp chứa hai số nguyên N , M đợc ghi cách theo thứ tự số cọc đĩa số cọc toán tháp Hà Nội

Kết Quả : ghi file Hantower.out số lần tối thiểu chuyển đĩa cần thực

VÝ dơ : Híng DÉn :

Gọi A[i,j] số bớc chuyển nhỏ ta có i cọc có j đĩa cần chuyển từ cọc đến cọc j

Tríc tiªn ta xÐt c¸ch chun :

 Đầu tiên ta chuyển lợng l đĩa ( l<=i ) từ cọc đến coc ( i - ) sử dụng i cọc

 Sau chuyển (j-l) lại cọc sang cọc i sử dụng i-1 cọc ( trừ cọc i-l )

 Sau chuyển l cọc i-1 sang cọc i sử dụng i cọc

Do ta có :

(43)

Trong xâu ký tự gồm chữ thờng Đối với xâu ký tự, ta tiến hành phép biến đổi sau:

1 Thay mét chữ chữ khác, ví dụ: test -> text;

2 Bỏ chữ bất kỳ, ví dụ: text -> ext text -> txt;

3 Thêm chữ vào vị trí bất kỳ, ví dụ: each -> peach, bat -> boat, test -> tests; Đổi chỗ hai chữ liền kề, ví dụ: cat -> act Với hai xâu S1 S2, ta định nghĩa khoảng cách từ S1 đến S2 số lợng phép biến đổi thuộc bốn loại mà áp dụng liên tiếp vào S1 ta nhận đợc S2

Dữ liệu: Vào đợc cho bởi:

- File văn TEXT.DAT gồm số dòng, dòng không 80 ký tự, dòng ghi số xâu, hai xâu liên tiếp cách ký tự rỗng

File văn LEX.DAT (từ điển), dòng thứ ghi số nguyên dơng M<=4000 (số lợng tõ tõ

điển), M dòng tiếp theo, dịng ghi xâu có độ dài khơng q 20, xâu đợc viết theo thứ tự từ điển

Chơng trình cần ghi file văn NEAREST.SOL nh sau: Với xâu S đọc đợc từ file TEXT.DAT, ghi nhóm dịng: dịng thứ ghi khoảng cách H nhỏ từ S đến xâu từ điển, dòng thứ hai ghi số lợng K xâu từ điển có khoảng cách đến S H, K dòng tiếp theo, dòng ghi xâu K xâu nói

Híng DÉn :

Theo định nghĩa, với hai xâu S1 S2, khoảng cách từ S1 đến S2 khoảng cách từ S2 đến S1 Đoạn chơng trình sau giải việc tính khoảng cách hai xâu ký tự cho dới dạng hàm CheckDistance

Distance[i,j] số phép biến đổi xâu i S1 xâu j S2 cần biến đổi :

Distance[i,j]:=Min(Distance[i,j-1]+1 ; Distance[i-1,j]+1 ; Distance[i-t,j-t]+ h)

Trong t h giá trị chạy xuống vị trí mà hai xâu đổi chỗ ( động tác ) Đoan trình sau trình bày rõ :

const

MaxL = 20; MaxN = 4000; type

Words = string[MaxL];

matrix = array [0 MaxL,0 MaxL] of word; var

(44)

if (a=b) then Change:=0 else Change:=1; end;

function CheckDistance (var A: Words; var B: Words): word;

var

i,j,t : word; nA,nB : byte; m1,m2 : word; begin

FillChar(Distance,sizeof(Distance),0); Distance[0,0]:=0;

nA:=Length(A); nB:=Length(B); for i:=1 to nA

Distance[i,0]:=Distance[i-1,0]+1; for i:=1 to nB

Distance[0,i]:=Distance[0,i-1]+1; for i:=1 to nA

for j:=1 to nB begin

Distance[i,j]:=Distance[i-1,j-1]+Change(A[i],B[j]);

m1:=Distance[i-1,j]+1; m2:=Distance[i,j-1]+1;

if (m1<Distance[i,j]) then Distance[i,j]:=m1;

if (m2<Distance[i,j]) then Distance[i,j]:=m2;

if (i>1) and (j>1) and (A[i]<>B[j]) then begin

if (A[i]=B[j-1]) then begin

t:=i-1;

while (t>0) and (B[j]<>A[t]) dec(t);

if (t>0) and

(Distance[i,j]>Distance[t-1,j-2]+(i-t)) then

Distance[i,j]:=Distance[t-1,j-2]+ (i-t);

end;

if (A[i-1]=B[j]) then begin

t:=j-1;

while (t>0) and (B[t]<>A[i]) dec(t);

if (t>0) and

(Distance[i,j]>Distance[i-2,t-1]+(j-t)) then

Distance[i,j]:=Distance[i-2,t-1]+ (j-t);

end; end;

end;

(45)

Bài toán 37 : Trò Chơi Poli Đề Bài :

Polygon l mt trũ chơi cho ngời mà bắt đầu đa giác N đỉnh ( 3<=N<=50) , xem hình với N=4 Mỗi đỉnh đợc đánh nhãn với số nguyên Mỗi cạnh đợc đánh nhãn dấu cộng dấu * , đợc đánh số từ đến N

H×nh :

+

1 + *3

* Trò chơi nh sau :

Bc i , cạnh đợc tách  Sau , lần lợt theo bớc sau :

+ Chọn cạnh E hai đỉnh V1,V2 hai đầu mút cạnh E

+ Thay cạnh E đỉnh đợc đánh nhãn số kết việc biểu diễn phép toán biểu thị cạnh E số đợc đánh nhãn V1,V2

Trị chơi kết thúc khơng cịn cạnh , điểm đợc tính nhãn đỉnh cịn lại Ví Dụ : Xét đa giác nh hình Ngời chơi bắt đầu cách tách cnh

Hình : Tách cạnh + +

* Sau chọn cạnh

Hình : Chọn cạnh ( -2 = -7 + )

+ * Rồi đến cạnh

Hình : Chọn cạnh ( -4 = (2)*2)

(46)

Và cuối chọn cạnh Điểm thu đợc trò chơi theo cách

H×nh : Chän c¹nh ( = + (-4))

Yêu cầu : Cho đa giác , viết chơng trình tính điểm cao danh sách tất cạnh tách ( mà dựa vào việc tách cạnh dẫn đến điểm cao )

Dữ liệu : Vào từ file Polygon.Inp Miêu tả đa giác với N đỉnh , gồm dòng :

 Dòng số N ( số đỉnh đa giác )  Dòng thứ hai nhãn cạnh 1, N xen lẫn

với nhãn đỉnh ( hai cạnh , sau , Cuối n ) tất cách dấu cách Nhãn cạnh t ( tơng ứng với dấu + x tơng ứng với * )

KÕt qu¶ : Ghi file Polygon.Out :

 Dòng ghi đợc số điểm cao nhận từ liệu vào

 Dòng thứ hai danh sách cạnh đợc tách mà dựa vào việc tách cạnh cho số điểm cao đạt đợc

VÝ Dô :

POLYGON.INP POLYGON.OUT

4 t -7 t x x 33

Híng DÉn :

Bài toán 38 : In Thông Tin Đề Bài :

Một máy in kiểu cổ có khn chữ đợc khắc vịng, chữ đợc khắc vòng 0,1 nhiều vị trí Ngời ta xoay vịng khn chữ quanh trục cố định Để in ký, ngời ta phải xoay vịng khn chữ cho ký tự cần in đến đợc vị trí nằm băng mực roòi ấn nút I (in) Để xoay vòng chữ sang trái vị trí, ta ấn nút T (trái) Để xoay vịng chữ sang phải vị trí, ta ấn nút P (phải) Để tạo dấu cách, ta ấnnút C (cách) Các nút I C không làm xoay vịng khn Tìm chuỗi thao tác ngắn để in mt chui ký t

Dữ liệu: Vào File B2.INP

Bộ liệu gồm dòng Dòng thứ gồm chữ đợc khắc vịng khn in (chữ chữ nằm băng mục) Dòng thứ hai chuỗi văn cần in

D÷ liƯu Ra File B2.OUT

Dãy ngắn gồm cáclệnh L, P, I, C mà đợc sử dụng để in chuỗi văn nhập Nếu khơng thể in chuỗi văn với vịng khn in cho, in dịng chữ "khơng the in đuoc"

(47)

abaed I P I T I C T I T T I P I

aba dac Híng DÉn :

Gọi A[i,j] giá trị thao tác để in S[i] địa điểm j máy in

Tøc lµ :

NÕu S1[i]=#32 then A[i,j]:=A[i-1,j]+1 ; NÕu S1[i]<>S2[j] then A[i,j]:=Maxint ;

Nếu s1[i]=S2[j] then A[i,j]:=MinA[i-1,t]+số bớc quay từ t đến j ;

Bµi toán39 : Cắt

Đề Bài :

Ta cn cắt hình chữ nhật có kích thớc MxN (m,N nguyên dơng không lớn 100 ) thành số hình chữ nhật vng có kích thớc ngun dơng có cạnh song song với cạnh hình chữ nhật ban đầu Máy cắt hình chữ nhật cắt đợc nhát theo phơng song song với hai cạnh hình chữ nht

Yêu cầu : HÃy cắt nhát cắt cho tạo nhát hình vuông

Dữ liệu : Vào cho file Cut.Inp :  Dịng thứ ghi số M , N

KÕt qu¶ : Ghi file Cut.Out :

Dòng thứ ghi số hình vuông

 Dịng ghi kích thớc hình vng

VÝ dơ : Cut.Inp

Cut.Out

3 2 Híng dÉn :

Thuật toán : Quy hoạch động

Trớc tiên ta thấy tìm ớc chung lớn M N dặt M1=M div Ucln(M,N) N1=N div ucln(M,N) ta cần tìm hình chữ nhật có cạnh M1 , N1 phải chia làm hình (ít ) Thì số hình vuông hình chữ nhật có cạnh (M,N) có số hình vuông gấp Ucln(M,N)2 hình vuông có cạnh (M1,N1)

Gọi Shv [i,j] số hình vuông cắt hình chữ nhật có cạnh i,j Ta cã c«ng thøc truy håi :

 fillchar(shv,sizeof(shv),0);  shv[i,1]:=i;

 shv[1,i]:=i;

 If i=j then Shv[i,j]:=1 ;  If I<>J then

(48)

Shv[i,j]:=MinShv[k,j]+Shv[i-K,j] ; K=1, I div 2;

Shv[i,j]:=MinShv[i,k]+Shv[i,j-K] ; K=1, j div 2;

End ;

Bài toán 40 : Ghép tam giác Đề :

Cho N đoạn thẳng (N <= 40) có tổng chiều dài <= 600 HÃy tìm cách ghép đoạn thẳng thành cạnh tam giác có diện tích lớn với điều kiện sau:

+ Tất đoạn thẳng phải đợc sử dụng

+ Mỗi cạnh tam giác phải ghép nguyên số đoạn thẳng

Dữ liệu : Vào từ file Ghep.Inp : Dòng đầu tiênlà số N

 N dßng tiÕp theo, dßng thø i ghi si chiều dài đoạng thẳng thứ i

KÕt qu¶ : Ghi file GHep.Out

 Dịng đầu ghi diện tích lớn tìm đợc, xác đến chữ số sau dấu phẩy

 dòng tiếp theo, dòng ghi danh sách tên đoạn thẳng đợc chọn để làm cạnh tam giác

Híng DÉn :

Ta dùng phơng pháp qui hoạch động:

Gọi C(k,i,j,)l có giá trị cho biết phân tích tập đoạn thẳng từ đến k thành tập tổng độ dài i, j l

Khi đó, ta dễ dàng có thẻ tính C(k,i,j,l) từ C(k-1,x,yz) dơn giản phép thử ghép đoạn k vào tập i , j , l

Khi nghiệm của tốn đựoc tìm thấy cở duyệt qua C(n,x,y,z) xem xây dựng nên cạnh tam giác có diện tích lớn

Chó ý:

+ Tính C(k,i,j,l) thực chất cần C(k,i,j) với i <= j, i+j+l tổng độ dài đoạn từ đến k

+ Râ ràng C(k,i,j) cần tính từ C(k-1,x,y) nên không cần phải lu toàn C(k,i,j) mà cần lu màng C(i,j) tính lẫn

Bài toán 41 : DÃy nhị phân Đề :

Mt tập hợp S gồm dãy N bit 0, khơng có hai bit kề Ví dụ với N = S gồm dãy 00000, 00001, 000101, … Tập S đợc săp xếp theo chiều tăng dần số nguyên tơng ứng mà dãy bit bieu dien Cho số N số nguyên M cho biết dãy bit thứ M S

(49)

 Một dòng ghi số N, M (N <= 40, M đảm bảo có nghiệm)

KÕt qu¶ : Ghi file Nhiphan.Out

 Dãy N số 0, ghi liền mô tả dãy nhị phân tìm đựơc

Híng DÉn :

Gọi C(i) số phần tử tập S øng víi N = i

C«ng thøc tÝnh truy håi C(i) = C(i-1) + C(i-2) C(0) = 1; C(1) = 1;

Thuật toán xây dng d·y M nh sau: For i := to N

Begin

If M > C(N-i) then Begin

Bit[i] = 1;

M = M - C(N-i); End

Else Bit[i] = 0; End;

Bµi toán 42 : Đoạn

Đề :

Cho hai số nguyên dơng N k, tập S gồm dãy nhị phân độ dài N thoả mãn số đoạn liên tiếp k Ví dụ N=5, k = tập S gồm dãy 00101, 01011, 11011,… Các phần tử S đựoc xếp theo thú tự tăng dần số nguyên tơng ứng Hãy cho biết dãy nhị phân thứ M S

D÷ liƯu : Cho tõ file Doan1.Inp

 Một dòng số nguyên N, k , M (N <= 50) Các số cho đảm bảo có nghiệm

KÕt qu¶ : Ghi file Doan1.Out

 Một dòng gồm số 0, ghi liền thể dãy nhị phân tìm đựơc

Híng DÉn :

Gọi C(i,j) số dãy nhị phân độ dài i có j đoạn liên tiếp, ta dùng cơng thức sau đề tính C(i,j)

C(i,j) = 0;

For u = i downto C(i,j) := C(i,j) + C(u-2,j-1) + C(u-1,j);

Sau tính C(i,j), ta xây dựng dÃy thứ M nh sau:

i := 1;

for j := k downto begin

if M <= C(N-i,j) then begin

Bit[i] := 0; i := i + 1; end

else begin

(50)

repeat

Bit[i] := 1; i := i+1;

if M > C(N-i,j-1) then M := M-C(N-i,j-1) else Break;

until False; end;

end;

for j := i to N Bit[j] := 0;

Bài tốn 43 : Chi phí đờng Đề :

Một Công ty vận tải đờng muốn xác định chi phí nhỏ để di chuyển từ thành phố đến thành phố khác Công ty có danh sách trạm xăng đoạn đờng di chuyển hai thành phố Danh sách bao gồm vị trí trạm xăng giá bán lít xăng trạm

Để đơn giản cho cách tính chi phí, Cơng ty sử dụng quy tắc hành vi ngời lái xe:

 Lái xe không dừng lại trạm xăng để nạp xăng cho xe chừng xăng tỏng bình xăng xe cịn nhiều nửa dung tích bình đủ để đạt trạm xăng

 Mỗi dừng xe để nạp xăng, lái xe np y bỡnh xng

Mỗi dừng xe nạp xăng trạm xăng lái xe uống nớc mÊt USD

 điểm xuất phát bình xăng ln đợc đổ đầy

Cần viết chơng trình tính chi phí tối thiểu để lái xe mua xăng uống nớc dọc đờng

D÷ liƯu: Vào từ file văn MINBT.INP:

Thụng tin v đoạn đờng cầu bao gồm dòng sau:

Dòng 1: Chứa số thực khoảng cách (km) điểm xuất phát đích

Dßng 2: Gåm số thực số nguyên: V - dung tích bình xăng (lít);

C - khoảng cách xe nhờ sử dụng lít xăng (km);

P - chi phí đổ đầy xăng điểm xuất phát (USD); n - số lợng trạm xăng trờn tuyn ng (n < 101)

Mỗi dòng thứ i sè n dßng tiÕp theo chøa hai sè thùc

di - khoảng cách từ điểm xuất phát đến trạm xăng thứ i

pi - giá lít xăng (đơn vị tính: cent = 0,01 USD), i = 1,2, n

(51)

Kết quả: Ghi file MINBT.OUT tổng chi phí (USD) (có tính chi phí đổ xăng điểm xuất phát) Quy ớc làm trịn chi phí lần chi trạm xăng đến cent

VÝ dơ: File MINBT.INP vµ MINBT.OUT cã thÓ MINBT.INP

475,6

11,9 27,4 14,98 102.0 99.9

220.0 132.9 256.3 147.9 275.0 102.9 277.6 112.9 381.8 100.9 MINBT.OUT 27.31 USD Híng DÉn :

Gäi Mind[i] lµ sè tiỊn Ýt nhÊt dõng ë i Ta cã :

Mind[i]:=MinMind[j]+Tiền để j đến i

Bài toán giống toán dạng Bài toán 44 : Quân cờ Đôminô

Đề :

Trong bi toỏn ny, qn cờ đơminơ hình có kích thớc 2*1, ô ghi số nguyên dơng

không 10 Có N qn cờ đơminơ xếp thành hàng ngang nh hình vẽ dới

1 6 4

6 10

Yêu cầu : Cho trạng qn Đơminơ tìm cách lật quân Đôminô(đổi chỗ ô với ô dới) cho chêch lệch tổng số hàng với hàng dới nhỏ với số phép lật

D÷ liƯu : Cho từ file Domino.Inp

Dòng ghi số nguyên dơng N (N <= 50) Dòng thứ hai ghi số hàng

Dòng thứ ba ghi số hàng dới Kết : Ghi file Domino.Out

 Dòng đầu ghi chêch lệch nhỏ tìm đợc số đơminơ cần chuyển

 Dòng thứ hai ghi danh sách thứ tự qn minơ cần chuyển

Híng DÉn :

Ta giải toán phơng pháp qui hoạch động

Gọi C(i,j) số phép lật nhỏ vơi quân từ đến i, để hàng có tổng j

C(i,j) = min{ C(i-1,j-Tren(i)) , C(i-1,j-Duoi(i)) + 1}

(52)

Bài toán 45 : Lắp ráp linh kiện Đề bµi :

Trong dây chuyền lắp ráp, rơbơt phải lắp ráp lần lợt N linh kiện theo thứ tự từ đến N Rơbốt có M cơng cụ để lắp ráp Biết C(i,j) thời gian rôbôt lắp linh kiện i công cụ j (1 <= i <= N ; <= j <= M), đồng thịi i, j hai cơng cụ đợc dùng lắp ráp hai linh kiện liên tiếp rôbôt phải thêm D(i,j) thời gian (1 <= i,j <= N) Hãy cho rơbơt lịch trình thực lắp ráp linh kiện cho tổng thời gian nhỏ

D÷ liƯu : Cho tõ file laprap.Inp

Dòng dầu ghi hai số N, M ( N, M <= 100 )  N dßng mô tả ma trận C

M dịng cuối dịng M số mơ tả ma trận D (Các số cho input số nguyên dơng <= 32000 )

KÕt qu¶ : Ghi file Laprap.Out

 Dòng đầu ghi T thời gian nhỏ tìm đợc  Dịng hai ghi N số, số thứ i cơng

cụ thực lắp ráp linh kiện i Hớng Dẫn :

Ta giải toán phơng pháp Qui hoạch động: Gọi F(i,j) thời gian tối thiểu cần để lắp ráp i linh kiện sử dụng cơng cụ j thực lắp ráp linh kiện i Ta tính F(i,j) theo cơng thứ sau :

F(i,j) = Min {F(i-1,k) + D(k,j) + C(i,j)} <= k <= M

Bài toán 46 : Đờng chéo đa giác lồi

Đề bµi :

Cho đa giác lồi N đỉnh mặt phẳng, đỉnh theo thứ tự vịng quanh có tên 1, 2, , N, N 20

1) Hãy chia đa giác thành N-2 tam giác đờng chéo không cắt điểm khác đỉnh cho tổng độ dài đờng chéo dùng để chia nhỏ

2) Hãy chia đa giác thành N-2 tam giác đờng chéo không cắt điểm khác đỉnh cho đờng chéo dài đờng chéo dùng có độ dài nhỏ

Chó ý r»ng nói chung hai cách chia hai câu không giống

Dữ liệu : Với i N, đỉnh i đợc cho toạ độ (là số thực) Ai, Bi ghi dòng thứ i file DG.INP Dữ liệu nh mô tả (là đỉnh liên tiếp đa giác lồi)

(53)

theo ghi dòng đờng chéo cách ghi tên hai đỉnh đầu mút Sau dịng ghi độ dài đờng chéo dài nhất, N-2 dòng ghi dòng đờng chéo theo quy cách nh câu Hai số liên tiếp dịng cách dấu trống Số thực viết với số lẻ sau dấu phẩy

VÝ dô:

DG.INP DG.OUT

0 1.412

1

1 1.412

0

Híng DÉn : C©u1

- Các đỉnh có tên K=0,1,2, , N-1 hiểu K mod N

- Với L = 1, 2, , N-2, xét đa giác gồm L đỉnh liên tiếp P, P+1, , P+L-1 xem cạnh (P,P+L-1) đờng chéo Ký hiệu S(P,P+L-1) tổng nhỏ đờng chéo chia L thành tam giác Ta có S(P,P)=S(P,P+1)=0; S(P,P+2)=d(P,P+2) (độ dài cạnh (P,P+2)

- Giả sử ta biế(P,P+L-1) với P=0, , N-1 L=1,2, , K Ta có hệ thức đệ quy

S(P,P+K) = d(P,P+K) + Min {S(P,i)+S(i,K)} (*) Min lấy theo i mà P+1<=i<=P+K-1 Câu

Tơng tự với S(P,P+L-1) hiểu Min Max độ dài đờng chéo (*) trở thành hệ thức sau: S(P,P+K) = Min Max{d(P,P+K), S(P,i), S(i,K)} (**)

Bài toán 47 : Cấp điện

Đề :

Trong đợt cắm trại , có N trại đợc cắm Vị trí trại , coi nh điêm mặt phẳng , lần lợt đỉnh đa giác lồi Ngời ta cần tiến hành cấp điện cho trại Máy phát điện phải đặt trại ( trại huy ), có đờng dây điện qua tất N trại , trại có máy phát Yêu cầu : tìm cách mắc điện cho trậi cho dây điện cần mắc qua tất N trại có độ dài nhỏ

D÷ liƯu :

 N ( N <= 200)

 N dòng , dòng thứ i ghi hai số x , y cho biết toạ đọ mặt phẳng trại thứ i

KÕt Qu¶ :

 Dịng đầu độ dài dây tìm đợc

 Dòng ghi N số thứ tự trại đờng dây , trại

Híng DÉn :

(54)

A(i,j) độ dài dây ngắn cần mắc cho trại i , i+1 , … j ( đỉnh theo chiều đánh số tức sau n ) , i

B(i,j) định nghĩa tơng tự nhng thay i phải j

Giả sử ta tính đợc hết A(i,j) , B(i,j) mà j-i <k , ta tiếp tục tính trờng hợp j-i=k Ta ý đa giác lỗi nên

tập đỉnh i , … j tạo thành đa giác lồi , đờng ngắn phải có dạng :

Hoặc dến i+1 : độ dài ngắn = độ dài(i,i+1) + A(i+1,j)

Hoặc đến j : = độ dài(i,j) + B(i+1,j)

Chú ý phải B(i+1,j) đờng tiếp j

A(i,j) = hai độ dài Tơng tự ta tính B(i,j) với A(i,j)

Nh cuối độ dài dây nhỏ nhát A(1,n)

Bài to¸n 48: D·y låi

Cho N sè A[1]…A[N]

1 dãy k phần tử dãy A là: dãy A[i1], A[i2], …,A[ik], đó: 1<=i1 < i2 <…<ik<=N

Dãy lồi dãy có dạng: B[1] > B[2] > … > B[i] < B[i + 1] < … < B[x] (x l di ca dóy)

Yêu cầu:

H·y t×m d·y cđa d·y A cã nhiỊu phần tử thoả mÃn, dÃy lồi

Input:

- dòng đầu số N - dÃy A[]

Output:

- Độ dài x lớn - Dãy đợc chọn VD:

DAYLOI.INP

4 1 DAYLOI.OUT:

Ngày đăng: 28/05/2021, 13:13

TÀI LIỆU CÙNG NGƯỜI DÙNG

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

TÀI LIỆU LIÊN QUAN

w