Gián án De on thi HSG mon Tin hoc

19 661 9
Gián án De on thi HSG mon Tin hoc

Đ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

Bài toán chúc Tết Một người quyết định dành một ngày Tết để đến chúc Tết các bạn của mình. Để chắc chắn, hôm trước anh ta đã điện thoại đến từng người để hỏi khoảng thời gian mà người đó có thể tiếp mình. Giả sử có N người được hỏi (đánh số từ 1 đến N), người thứ i cho biết thời gian có thể tiếp trong ngày là từ A i đến B i (i = 1, 2, ., N). Giả thiết rằng, khoảng thời gian cần thiết cho mỗi cuộc gặp là H và khoảng thời gian chuẩn bị từ một cuộc gặp đến một cuộc gặp kế tiếp là T. Bạn hãy xây dựng giúp một lịch chúc Tết để anh ta có thể chúc Tết được nhiều người nhất. File dữ liệu vào trong file CHUCTET.INP gồm dòng đầu ghi số N, dòng thứ i trong số N dòng tiếp theo ghi khoảng thời gian có thể tiếp khách của người i gồm 2 số thực A i và B i (cách nhau ít nhất một dấu trắng). Dòng tiếp theo ghi giá trị H (số thực) và dòng cuối cùng ghi giá trị T (số thực). Giả thiết rằng các giá trị thời gian đều được viết dưới dạng thập phân theo đơn vị giờ, tính đến 1 số lẻ (thí dụ 10.5 có nghĩa là mười giờ rưỡi) và đều nằm trong khoảng từ 8 đến 21 (từ 8 giờ sáng đến 9 giờ tối). Số khách tối đa không quá 30. Kết quả ghi ra file CHUCTET.OUT gồm dòng đầu ghi K là số người được thăm, K dòng tiếp theo ghi trình tự đi thăm, mỗi dòng gồm 2 số (ghi cách nhau ít nhất một dấu trắng): số đầu là số hiệu người được thăm, số tiếp theo là thời điểm gặp tương ứng. Ví dụ CHUCTET.INP 20 10.5 12.6 15.5 16.6 14.0 14.1 17.5 21.0 15.0 16.1 19.0 21.0 10.5 13.6 12.5 12.6 11.5 13.6 12.5 15.6 16.0 18.1 13.5 14.6 12.5 17.6 13.0 13.1 18.5 21.0 9.0 13.1 10.5 11.6 10.5 12.6 18.0 21.0 0.5 0.1 CHUCTET.OUT 16 17 9.0 1 10.5 18 11.1 19 11.7 8 12.3 10 12.9 11 13.5 13 14.1 5 15.0 2 15.6 12 16.2 14 16.8 4 17.5 7 19.0 16 19.6 20 20.2 Truyền tin trên mạng Trong một mạng gồm n máy tính đánh số từ 1 đến N. Sơ đồ nối mạng đựơc cho bởi hệ thống gồm M kênh nối trực tiếp giữa một số cặp máy tính trong mạng. Biết chi phí truyền một đơn vị thông tin theo mỗi kênh nối của mạng. Người ta cần chuyển một bức thông điệp từ máy S đến T. Để đảm bảo an toàn, người ta muốn chuyển bức thông điệp này theo K đường truyền tin khác nhau. Hai đường truyền tin được gọi là khác nhau nếu không có bất cứ kênh nối trực tiêp nào được dùng chung trên cả hai đường truyền tin. Chi phí của một đường truyền tin được hiểu là chi phí trên các kênh của nó. Yêu cầu : Giả sử bức thông điệp có độ dài là 1 đơn vị thông tin, hãy tìm cách chuyển thông tin từ S đến T sao cho tổng chi phí chuyển thông tin (bằng tổng chi phí theo cả K đường truyền tin) là nhỏ nhất. Dữ liệu: Vào từ file văn bản Ttin.INP: - Dòng đầu tiên ghi năm số N,M,S,T,K cách nhau bởi dấu cách (N≤100). - M dòng sau mỗi dòng ghi ba số d i , c i , g i : trong đó d i , c i là chỉ số của hai máy tương ứng có kênh nỗi và g i (nguyên dương) là chi phí để truyền một đơn vị thông tin từ máy d i đến máy c i và ngựơc lại (i=1 n). Kết quả: Ghi ra file văn bản TTIN.OUT: - Dòng đầu tiên ghi chi phí truyền thông điệp theo cách tìm đựơc - K dòng tiếp theo, mỗi dòng ghi đường truyền tin dưới dạng dãy có thứ tự các máy bắt đầu từ máy S và kết thúc ở máy T. - Nếu không tìm đủ K đường đưa ra một dòng duy nhất: NO SOLUTION. Ví dụ: Số chung lớn nhất Cho 2 xâu: ???? X = x 1 x 2 x M . (Với x i là các kí tự số từ ?0? đến ?9?) ???? Y = y 1 y 2 y N .( Với y i là các kí tự số từ ?0? đến ?9?) (M, N <= 250) Ta gọi: Z = z 1 z 2 z k là xâu chung của 2 xâu X, Y nếu xâu Z nhận được từ xâu X bằng cách xoá đi một số kí tự và cũng nhận được từ xâu Y bằng cách xoá đi một số kí tự. Yêu cầu : Tìm một xâu chung của 2 xâu X, Y sao cho xâu nhận được tạo thành một số lớn nhất có thể được. Dữ liệu vào file: String.inp Gồm 2 dòng, dòng 1 là xâu X, dòng 2 là xâu Y. Kết quả ra file: String.out Gồm 1 dòng duy nhất là số lớn nhất có thể nhận được. Ví dụ : String.inp String.out 19012304 034012 34 Ứng dụng luồng cực đại trong bài toán tối ưu rời rạc I. Bài toán Xét bài toán: Trong đó a ij thuộc {0,1} p i nguyên dương i = 1,2, .,m; j = 1,2, .,n Bài toán trên là mô hình toán học của nhiều bài toán tối ưu tổ hợp trong thực tế. Ví dụ: II. Ví dụ 1. Bài toán phân nhóm sinh hoạt: Có m sinh viên và n nhóm sinh hoạt chuyên đề.Với mỗi sinh viên i biết: - a ij =1, nếu sinh viên i có nguyện vọng tham gia vào nhóm j - a ij =0, nếu ngược lại - p i là số lượng nhóm chuyên đề mà sinh viên i phải tham dự i=1,2, .,m; j=1,2, .,n Trong số các cách phân các sinh viên vào nhóm chuyên đề mà họ có nguyện vọng tham gia và đảm bảo mỗi sinh viên i phải tham gia đúng p i nhóm, hãy tìm cách phân phối với số người trong nhóm có nhiều sinh viên tham gia nhất là nhỏ nhất có thể được. Đưa vào các biến số: x ij =1, nếu sinh viên i tham gia vào nhóm j x ij = 0, nếu ngược lại i=1, 2, .,m ; j=1, 2, .,n, khi đó dễ thấy mô hình toán học cho bài toán đặt ra chính là bài toán (1)- (2). 2. Bài toán lập lịch cho hội nghị: Một hội nghị có m tiểu ban, mỗi tiểu ban cần sinh hoạt trong một ngày tại phòng họp phù hợp với nó. Có n phòng họp dành cho việc sinh hoạt của các tiểu ban. Biết: - a ij =1, nếu phòng họp i là thích hợp với tiểu ban j - a ij =0, nếu ngược lại i=1, 2, .,m, j=1, 2, .,n. Hãy bố trí các phòng họp cho các tiểu ban sao cho hội nghị kết thúc sau ít ngày làm việc nhất. Đưa vào các biến số : x ij = 1, nếu bố trí tiểu ban i làm việc ở phòng j x ij = 0, nếu ngược lại i=1, 2, .,m ; j=1, 2, .,n, khi đó dễ thấy mô hình toán học cho bài toán đặt ra chính là bài toán (1)- (2), trong đó pi =1, i=1, 2, .,m. III. Cơ sở thuật toán Bổ đề 1: Bài toán (1)-(2) có nghiệm tối ưu khi và chỉ khi: Chứng minh: Điều kiện cần là hiển nhiên vì sự tồn tại phương án của bài toán suy ra bất đẳng thức trong (3) được thực hiện ít nhất dưới dạng dấu đẳng thức. Điều kiện đủ: Chỉ cần chỉ ra rằng nếu có (3) thì luôn có phương án. Giả sử (3) đúng, gọi: Do (3) là điều kiện để (1)-(2) có nghiệm nên trong phần tiếp theo ta luôn giả thiết rằng điều kiện được thực hiên. Bây giờ ta chỉ ra rằng bài toán (1)-(2) có thể chuyển về giải một số hữu hạn bài toán luồng cực đại trong mạng. Trước hết với mỗi k nguyên dương ta xây dựng mạng G (k) = (V,E) với e thuộc E: khả năng thông qua c(e) c(s,u i ) = p i c(u i ,v j ) = a ij c(v j ,t) = k Bổ đề 2: Giả sử với k nào đó luồng cực đại trong mạng G (k) có giá trị Δ thì x* với x* ij = Φ (u i ,v j ) là phương án của bài toán (1)-(2) trong đó Φ (u i ,v j ) là luồng qua (u i ,v j ) Chứng minh: Thật vậy, do luồng cực đại trong mạng có giá trị Δ và là nguyên nên Φ(s,u i ) = p i và Φ(u i ,v j ) thuộc {0,1} với i=1,2, .,m;j=1,2, .,n Vậy x* là phương án của bài toán (1)-(2) (đpcm). Bổ đề 3: Giả sử x* là phương án tối ưu và k* là giá trị tối ưu của bài toán (1)-(2) thì luồng cực đại trong G (k*) có giá trị Δ Chứng minh: Do giá trị của luồng cực đại trong mạng G (k*) không vượt qu Δ, nên để chứng minh bổ đề ta chỉ cần chỉ ra luồng với giá trị Δ trong mạng G (k*) . Ta xây dựng luồng Φ như sau: Dễ dàng chứng minh Φ là luồng trong mạng G (m) có giá trị Δ.(đpcm) Bổ đề 4: Nếu k=m thì luồng cực đại trong mạng G (m) có giá trị Δ. Chứng minh: Lập luận tương tự bổ đề 3 ta chỉ cần chỉ ra luồng với giá trị Δ trong mạng G (m) . Thật vậy, giả sử x* là nghiệm bài toán (1)-(2) được xây dựng theo công thức như bổ đề 1, xây dựng Φ theo bổ đề 3 ta có luồng giá trị Δ.(đpcm) IV. Thuật toán: Từ nhận xét 2 và 3 suy ra việc giải bài toán (1)-(2) là tìm k* nguyên dương nhỏ nhất sao cho luồng cực đại trong mạng G (k*) có giá trị Δ. Nhận xét 4 giới hạn giá trị k* thuộc [1,m]. Từ đây rút ra thuật toán: áp dụng phương pháp chia nhị phân trên đoạn [1,m] tìm k* trong mỗi bước giải bài toán tìm luồng cực đại trong. V. Chương trình Input: file văn bản INPUT.TXT - Dòng 1: Chứa 2 số m,n (m,n <= 100) - Dòng 2: Chứa n số nguyên p 1 ,p 2 , ,p n - Trong m dòng tiếp theo mô tả mảng a Output: file văn bản OUTPUT.TXT - Dòng 1 chứa giá trị tối ưu tìm được - Các dòng sau mô tả mảng x Chương trình: Uses Crt; Const InputFile='Input.Txt'; OutputFile='Output.Txt'; Var a,x:Array[1 100,1 100]of Integer; TraceX,TraceY:Array[1 100]of Integer; p:Array[1 100]of Integer; Start,Finish,n,m,s,t,Delta,No:Integer; fi,fo:Text; Procedure Input; Var i,j:Integer; Begin Assign(fi,InputFile); Reset(fi); Readln(fi,m,n); Delta:=0; For i:=1 to m do begin read(fi,p[i]); Delta:=Delta+p[i]; End; For i:=1 to m do For j:=1 to n do read(fi,a[i,j]); Close(fi); s:=m+1; t:=n+1; For i:=1 to m do a[s,i]:=p[i]; End; Function FindPath:Boolean; Var Queue:Array[1 100]of Integer; i,j,First,Last,v:Integer; Begin Fillchar(TraceX,Sizeof(TraceX),0); Fillchar(TraceY,Sizeof(TraceY),0); First:=1; Last:=0; For i:=1 to m do If x[s,i]<a[s,i] then begin inc(last); Queue[last]:=i; traceX[i]:=-1; end; While First<=Last do Begin i:=Queue[First]; Inc(first); For j:=1 to n do If (traceY[j]=0)and(x[i,j]<a[i,j])then begin traceY[j]:=i; If x[j,t]<a[j,t] then begin Finish:=j; FindPath:=True; Exit; end; For v:=1 to m do if (TraceX[v]=0)and(x[v,j]>0) then begin Inc(Last); Queue[Last]:=v; TraceX[v]:=j; end; end; End; FindPath:=False; End; Function Min(x,y:Integer):Integer; Begin If x<y then Min:="x" else Min:="y; " End; Procedure IncFlow; Var IncValue,i,j:Integer; Begin IncValue:=a[finish,t]-x[Finish,t]; j:=Finish; While j>0 do begin i:=TraceY[j]; IncValue:=Min(IncValue,a[i,j]-x[i,j]); j:=TraceX[i]; If j>0 then IncValue:=Min(IncValue,x[i,j]); End; Start:=i; IncValue:=Min(IncValue,a[s,start]-x[s,start]); j:=Finish; While j>0 do begin i:=TraceY[j]; x[i,j]:=x[i,j]+IncValue; j:=TraceX[i]; If j>0 then x[i,j]:=x[i,j]-IncValue; End; x[s,start]:=x[s,start]+IncValue; x[finish,t]:=x[finish,t]+IncValue; End; Function MaxFlow(k:Integer):Integer; Var i,mf:Integer; Begin Fillchar(x,Sizeof(x),0); For i:=1 to n do a[i,t]:=k; Repeat If not FindPath then break; IncFlow; Until False; mf:=0; For i:=1 to m do mf:=mf+x[s,i]; MaxFlow:=mf; End; Procedure Process; var l,r,k:Integer; Begin l:=0; r:=m; While l<r do begin k:=(l+r)div 2; If MaxFlow(k)=Delta then r:=k else l:=k+1; End; No:=r; r:=MaxFlow(No); End; Procedure Output; Var i,j:Integer; Begin Assign(fo,OutputFile); Rewrite(fo); writeln(fo,No); For i:=1 to m do begin For j:=1 to n do write(fo,x[i,j],' '); writeln(fo); end; Close(fo); End; BEGIN Input; Process; Output; END. VI. Độ phức tạp tính toán Bài toán (1)-(2) giải được nhờ thuật toán đa thức có độ phức tạp tính toán là O(log 2 m.OFN) trong đó OFN là độ phức tạp tính toán tìm luồng cực đại. Bày tranh Cho n bức tranh mã số từ 1 n (n≤50). Người ta cần chọn ra một bức để đặt ở cửa phòng tranh, số còn lại được treo thẳng hàng trong phòng trên m vị trí định sẵn có mã số 1 m từ trái qua phải. Các bức tranh phải được treo theo trật tự nghiêm ngặt sau đây: tranh có số hiệu nhỏ phải treo ở trên tranh có số hiệu lớn. Biết các thông tin sau về mỗi bức tranh: - Tranh thứ i treo tại cửa sẽ đạt trị thẩm mỹ c[i]; - Tranh thứ i treo tại vị trí j sẽ đạt trị thẩm mỹ v[i,j]. - m+1≥n. - Các giá trị thẩm mỹ là những số tự nhiên không vượt quá 50. Yêu cầu: Hãy xác định một phương án treo tranh để có tổng trị thẩm mỹ là lớn nhất. Dữ liệu vào: Tệp văn bản ′ Picture.INP ′ - Dòng thứ nhất ghi n, m (cách nhau 1 dấu cách) - Dòng tiếp theo là n giá trị c. - Tiếp đến là n dòng, dòng i gồm m vị trí v[i,1], v[i,2], v[i,m]. Dữ liệu ra: Tệp văn bản ′ Picture.OUT′ - Dòng thứ nhất ghi giá trị thẩm mỹ lớn nhất tìm được - Dòng thứ hai: ghi mã số hiệu bức tranh treo ở cửa phòng tranh. - Dòng thứ 3 ghi n-1 số tự nhiên sắp tăng chặt cho biết mã số các vị trí được chọn để treo tranh Ví dụ: Ký tự đại diện Trong nhiều hệ điều hành người ta thường dùng ký tự đại diện * để thay thế cho một xâu ký tự bất kỳ (kể cả sâu rỗng) trong tên file. Ví dụ: *.PAS nghĩa là tên file bất kỳ có đuôi là PAS, A*B*C được hiểu là xâu ký tự bất kỳ bắt đầu bằng chữ A, kết thúc bằng chữ C và có chứa chữ B. Một từ là một xâu ký tự không chứa dấu cách. Cho A và B là hai từ, ta nói A là đặc biệt hoá của B nếu A có thể nhận được từ B bằng cách thay mỗi ký tự * (nếu có) bằng một xâu ký tự thích hợp kể cả xâu rỗng hoặc xâu có chứa chính ký tự *. Khi đó ta cũng nói B là tổng quát hoá của A. Hai từ nếu đã thừa nhận một từ là đặc biệt hoá chung thì cũng thừa nhận một từ đặc biệt hoá không chứa ký tự *. Hai từ bất kỳ bao giờ cũng thừa nhận một tổng quát hoá chung tầm thường là từ chỉ gồm 1 ký tự *. Một tổng quát hoá chung không tầm thường là một tổng quát hoá chứa ít nhất một ký tự khác với *. Ví dụ: 1. Từ AFX*18* và từ A*F*B cùng thừa nhận một đặc biệt hoá chung AFX18B. Hai từ này có tổng quát hoá chung không tầm thường, ví dụ: A* 2. Hai từ G3*R*P và từ G*1 sẽ không có đặc biệt hoá chung mặc dù có tổng quát hoá chung không tầm thường, ví dụ: G* 3. Hai từ A*B và B*A không có cả đặc biệt hoá chung cũng như không có tổng quát hoá chung không tầm thường. Yêu cầu: Cho N cặp từ bất kỳ, với mỗi cặp từ đó hãy xác định một đặc biệt hoá chung không chứa ký tự * nào và một tổng quát hoá chung không tầm thường nếu có. Dữ liệu vào: trong file văn bản có tên là GROUP.INP có cấu trúc như sau: - Dòng đầu tiên là một số N cho biết số lượng cặp từ phải xử lý. - Dòng thứ i trong N dòng tiếp theo sau chứa cặp từ phải xét thứ i, hai cặp từ này phân cách nhau bởi một dấu cách. Kết quả: Kết quả ghi ra file văn bản có tên là GROUP.OUT có N dòng. - Dòng thứ i sẽ chứa kết quả tương ứng với cặp thứ i. Mỗi dòng này cũng gồm hai từ cách nhau bởi một dấu cách. Từ thứ nhất là một đặc biệt hoá chung không chứa ký tự * nếu có. Trong trường hợp không có thì ghi ký tự *. Từ thứ hai là một tổng quát hoá chung không tầm thường nếu có. Trong trường hợp không có tổng quát hoá chng thì cũng ghi ký tự *. Ví dụ: GROUP.INP [...]... chúng ta lấy ví dụ với bài toán cụ thể là bài toán duyệt cây Giả sử có một cây nhị phân lưu trữ trong biến động t được định nghĩa: type pnode = ^node; node = record inf : variable; { truong luu tru thong tin } l,r : pnode; end; var t : pnode; Xuất phát từ nút gốc t, cần duyệt qua hết cây theo thứ tự từ trái qua phải Chương trình con đệ quy sẽ như sau: procedure Try(t : pnode); begin if t nil then... khác, chứ không phải là thay đổi thuật toán Ví dụ như trong các hàm đệ quy tính n! và số Fibonaci F(n) ta có thể thay bằng một vòng lặp để tính; Đó không phải là phương pháp khử đệ quy mà tôi muốn nói Trong trường hợp tổng quát, khử đệ quy là một việc làm khá phức tạp và khó khăn ở hàm n! hay F(n) ta có thể dùng một thuật toán không đệ quy, nhưng trong một số bài toán, đệ quy là bắt buộc Bạn có thể nói... được Các số cách nhau bởi dấu cách Ví dụ: Kỹ thuật khử đệ quy Đệ quy là quả tim trong các nghiên cứu lý thuyết cũng như thực hành tính toán, đã thể hiện rất nhiều sức mạnh và có ưu điểm trong nhiều bài toán Tuy nhiên bài này tôi lại đi ngược với công việc chúng ta thường làm: khử đệ quy, đó là vấn đề cũng có nhiều thú vị và đáng để chúng ta xem xét Khử đệ quy ở đây là biến một thủ tục đệ quy thành một... Program Quick_sort_Khu _de_ quy_Th; const inp = 'FileName.inp'; out = 'FileName.out'; maxstack = 1000; maxn = 1000; type it = longint; var a : array[1 maxn] of it; sl,sr : array[1 maxstack] of word; n,top : it; f : text; procedure push(l,r : word); begin inc(top); sl[top] := l; sr[top] := r; end; procedure pop(var l,r : word); begin l := sl[top]; r := sr[top]; dec(top); end; function stackEmpty : boolean;... trong một ô k rôbôt bắt đầu di chuyển đồng thời và mỗi lượt cả k rôbôt đều phải thực hiện việc di chuyển (nghĩa là không cho phép một rôbôt dừng lại một ô nào đó trong khi rôbôt khác thực hiện bước di chuyển) Bài toán đặt ra là tìm số bước di chuyển ít nhất mà k rôbôt phải thực hiện để có thể gặp nhau Chú ý rằng, tùy trạng thái của lưới, k rôbôt có thể không khi nào gặp được nhau Dữ liệu vào cho trong... 46 011000 000001 001001 010100 MEET.OUT DRRR LUUL Khoán công việc Có một ông chủ khoán cho anh đầy tớ tuần tự n công việc bắt đầu từ thời điểm 0 (nghĩa là tại mỗi thời điểm anh ấy chỉ thực hiện một việc và phải thực hiện liên tục từ khi bắt đầu đến lúc kết thúc) Các công việc được đánh số từ 1 đến n (1 . cực đại trong bài toán tối ưu rời rạc I. Bài toán Xét bài toán: Trong đó a ij thuộc {0,1} p i nguyên dương i = 1,2, .,m; j = 1,2, .,n Bài toán trên là. thấy mô hình toán học cho bài toán đặt ra chính là bài toán (1)- (2), trong đó pi =1, i=1, 2, .,m. III. Cơ sở thuật toán Bổ đề 1: Bài toán (1)-(2) có nghiệm

Ngày đăng: 04/12/2013, 19:11

Từ khóa liên quan

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

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

Tài liệu liên quan