De thi HSG tin 11 co dap an

12 87 3
De thi HSG tin 11 co dap an

Đ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

Dữ liệu: Dayloi.inp có dạng - Dòng đầu là N N≤2000 - Dòng tiếp theo là N số nguyên của dãy số các số kiểu integer Kết quả: Dayloi.out gồm: - Dòng đầu tiên ghi số phần tử lớn nhất của dãy[r]

(1)Bài File bài làm File liệu File kết Bài 1: Dãy lồi DAYLOI.PAS DAYLOI.INP DAYLOI.OUT Bài 2: Dây chuyền thông báo THONGBAO.PAS THONGBAO.INP THONGBAO.OUT Bài 3: Bày tranh PICTURE.PAS PICTURE.INP PICTURE.OUT Bài - Dãy lồi Dãy giá trị nguyên A=(A1, A2, …, AN) gọi là lồi, nó giảm dần từ A1 đến Ai nào đó, tăng dần tới AN Ví dụ dãy lồi: 10 −1 12 Yêu cầu: Lập trình nhập vào dãy số nguyên, cách xóa bớt số phần tử dãy và giữ nguyên trình tự các phần tử còn lại, ta nhận dãy lồi dài Dữ liệu: Dayloi.inp có dạng - Dòng đầu là N (N≤2000) - Dòng là N số nguyên dãy số (các số kiểu integer) Kết quả: Dayloi.out gồm: - Dòng đầu tiên ghi số phần tử lớn dãy tìm - Dòng ghi các số thuộc dãy (không thay đổi trật tự các phần tử dãy ban đầu) Ví dụ Bài - Dây chuyền thông báo Các học sinh lớp học định lập dây chuyền thông báo sau Mỗi học sinh chọn học sinh khác làm người để truyền trực tiếp thông báo Khi học sinh nhận thông báo, truyền cho người mình Dây chuyền thông báo gọi là tốt nó thoả mãn điều kiện: Khi học sinh A gửi thông báo cho người A2, A2 lại gửi cho người A 3, , thì cuối cùng thông báo đến người lớp kể người ban đầu (A1) đã phát thông báo Không thiết dây chuyền thông báo là tốt Bài toán đặt là: Cho trước dây chuyền thông báo, hãy tìm số ít việc thay đổi người để có thể nhận dây chuyền thông báo tốt Dữ liệu: file văn THONGBAO.INP đó dòng thứ ghi số N < 10000 là số hcjc sinh lớp, các họcc sinh này có tên từ đến N Trong dòng ghi N số, số thứ i là tên người học sinh i Kết quả: file THONGBAO.OUT sau: dòng thứ ghi số K là số thay đổi cần tiến hành (nếu dây chuyền thông báo đã cho là tốt thì K=0) Nếu K>0, K dòng tiếp theo, dòng ghi hai tên học sinh, người sau là người thay đổi người trước Ví dụ: THONGBAO.INP 10 10 THONGBAO.OUT 14 10 85 Bài - Bày tranh Cho n tranh mã số từ n (n≤50) Người ta cần chọn để đặt cửa phòng tranh, số còn lại treo thẳng hàng phòng trên m vị trí định sẵn có mã số m từ trái qua phải Các tranh phải 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 tranh: - Tranh thứ i treo cửa đạt trị thẩm mỹ c[i]; - Tranh thứ i treo vị trí j đạt trị thẩm mỹ v[i,j] - m+1≥n - Các giá trị thẩm mỹ là số tự nhiên không vượt quá 50 Yêu cầu: Hãy xác định phương án treo tranh để có tổng trị thẩm mỹ là lớn Dữ liệu: Picture.INP - Dòng thứ ghi n, m (cách dấu cách) - Dòng 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] Kết quả: Picture.OUT - Dòng thứ ghi giá trị thẩm mỹ lớn tìm - Dòng thứ hai: ghi mã số hiệu tranh treo cửa phòng tranh - Dòng thứ ghi n-1 số tự nhiên tăng chặt cho biết mã số các vị trí chọn để treo tranh Ví dụ: (2) Tư tưởng thuật toán: Bài - Dãy lồi Phân tích bài toán: Theo định nghĩa đề bài: "Dãy giá trị nguyên A =(A 1, A2, A3, , AN) gọi là lồi, nó giảm dần từ A1 đến Ai nào đó, tăng dần tới AN" ta thấy phần tử đặc biệt dãy lồi là điểm gãy Ai, dãy đơn điệu tăng hai phía điểm gãy Do không định nghĩa rõ nên đây chúng ta tự ngầm định: 1<i< N (nếu trùng với N thì dãy trở thành đơn điệu tăng giảm Từ nhận xét trên, ta giải bài toán sau: - Xây dựng mảng U thoả mãn: U[i] số phần tử dãy giảm dài là dãy dãy X 1, X2, , Xi, với Xi là phần tử nhỏ dãy - Xây dựng mảng D thoả mãn: D[i] số phần tử dãy tăng dài là dãy dãy X i, Xi+1, , Xn, với Xi là phần tử nhỏ dãy - Điểm gãy chọn là điểm vt thoả mãn: (D[i]>1 và D[j]>1 để đảm bảo điểm gãy không nằm đầu mút) Độ dài dãy lồi dài là: U[vt]+D[vt]-1 Lưu ý: Do đề bài nên số bài cho kết là dãy đơn điệu, còn số trả lời là không có dãy lồi, hai kết trên chấp nhận Bài giải cho kết là với dãy có điểm gãy trùng với hai điểm đầu mút Bài - Dây chuyền thông báo Thực chất đây là bài toán đồ thị, ta coi học sinh là đỉnh, thì đỉnh i nối với đỉnh j học sinh j là người học sinh i Ta thấy học sinh j có thể là người nhiều học sinh khác, không là người bất kì học sinh nào (tức là không có đỉnh i nào nối tới j) Gả sử ta có học sinh jo vậy, jo chọn cho mình nguời j 1, sau đó j1 lại chọn cho mình người j 2,… quá trình này tiếp diễn nguời mà j n chọn trùng với người ji nào đó Ta có thể hình dung jo… jn đã tạo nên cây với gốc là jo (cây không phân nhánh có gốc là jo là jn) Như học sinh j không chọn là người tạo cây, giả sử có a cây Những học sinh không tham gia bất kì cây nào tạo chu trình (vì học sinh nhóm này học sinh nhóm chọn là người kế tiếp) Giả sử có b chu trình, bây ta tìm cách ghép a cây và b chu trình (ta coi chu trình là cây khép kín, đỉnh i bất kì nó là ngọn, đỉnh i+1 là gốc) để tạo chu trình Rất đơn giản ta việc lấy cây này ghép với gốc cây ta cần ít a+b cách thay đổi để nhận dây chuyền thông báo tốt Bài - Bày tranh Đây là biến thể bài toán quy hoạch động Đầu tiên ta thử treo tranh k cửa (k = n), sau đó ứng với k ta tìm cách treo n −1 còn lại vào phòng, sau đó ta tìm giá trị thẩm mĩ lớn ứng với k Nếu nó lớn các giá trị thẩm mỹ ứng với k khác thì ta ghi nhận, cuối cùng ta có giá trị lớn Như bài toán trên thực là bài toán tìm giá trị thẩm mỹ lớn treo n −1 tranh vào m vị trí Để giải bài toán trên chúng ta có nhận xét sau: vì các tranh phải xếp theo thứ tự số hiệu nên với tranh i thì chúng ta có thể đặt sl = m − (n−1)+1 vị trí mà thôi, cụ thể với tranh i có thể đặt vị trí start đến finish đó start = i, finish = i+sl−1 i <k (k là tranh treo cửa) start =i-1; finish=i+sl-2 i>k gọi s[i,j] là độ thẩm mỹ lớn treo tranh i vị trí j (như j=start finish) Với vị trí có thể đặt tranh i ta so sánh với tranh tri (tri là tranh treo trước tranh i; tri = i-1 i<>k+1 và tri=i-2 i=k+1), để tìm max s[i,j], i treo j thì tri có thể treo start −1 tới j −1, vì hàm quy hoạch động ta là: s[i,j]:=max(s[i,j], s[tri,u]+v[i,j]); đó u= start −1 tới j −1 Để tìm lại kết chúng ta dùng mảng Tr (tr[i,j] tức là vị trí treo tranh tri) Cách làm trên trình bày bài giải (ở đây giải với maxM=150, vì đề bài không nói rõ MaxM, chúng ta hoàn toàn có thể tăng maxM việc sử dụng thêm mảng động) (3) Ngoài cách xử lý trên chúng ta có thể viết chương trình quy hoạch động dễ dàng cách, ứng với tranh k treo cửa thì ta loại tranh đó khỏi mảng v, tức là mảng v còn n −1 hàng Việc làm này thực đơn giản mảng cs[i] i=1… n−1 đó cs[i] là số tranh bố trí phòng, mảng cs không có giá trị cs[i] = k Bài - Dãy lồi const fin=’DAYLOI.INP’; fou=’DAYLOI.OUT’; nmax=2000; type arr= Array[0 nmax+1] of integer; var A: arr; U,Tru,D,TrD: arr; {Up, Down} n, KyLuc, Vitri: integer; f: text; begin assign(f,fou); rewrite(f); writeln(f,KyLuc); if KyLuc >0 then begin GhiLen(ViTri); GhiXuong(TrD[ViTri]); end; close(f); end; procedure ChuanBi; var i: integer; begin for i:=1 to n begin U[i]:=1; D[i]:=1; TrU[i]:=0; TrD[i]:=0; end; end; procedure Up; var i,j: integer; begin for i:=1 to n for j:=1 to i-1 if (A[i]then begin U[i]:=U[j]+1; TrU[i]:=j; end; end; Procedure Down; var i,j :integer; begin for i:=n downto for j:=n downto i+1 if (A[i] begin D[i]:=D[j]+1; TrD[i]:=j; end; end; Bài - Dây chuyền thông báo uses crt; const max=10001; fi=’thongbao.inp’; fo=’thongbao.out’; fu=’thongbao.luu’; var next:array[1 max] of integer; tt,ok:array[1 max] of byte; count,n:integer; f,g:text; read(f,next[i]); tt[next[i]]:=1; end; close(f); assign(f,fu); rewrite(f); count:=0; end; end; writeln(f,k,’ ’,finish); end; procedure init; var i,j:integer; begin assign(f,fi); reset(f); fillchar(tt,sizeof(tt),0); readln(f,n); for i:=1 to n begin procedure get_tree(k:integer); var i,finish:integer; begin inc(count); i:=k; while ok[i]=0 begin ok[i]:=1; finish:=i; i:=next[i]; procedure Nhap; var i: integer; begin assign(f,fin); reset(f); readln(f,n); for i:=1 to n read(f,A[i]); close(f); end; procedure GhiLen(i: integer); begin if TrU[i]<>0 then GhiLen(TrU[i]); Write(f,A[i],’ ’); end; procedure GhiXuong(i: integer); begin Write(f,A[i],’ ’); if TrD[i]<>0 then GhiXuong(TrD[i]); end; procedure Xuat; var i: integer; procedure TimDiemGay; var i: integer; begin KyLuc:=0; for i:=1 to n if (U[i]>1) and (D[i]>1) and (U[i] +D[i]-1>KyLuc) then begin KyLuc:=U[i]+D[i]-1; Vitri:=i; end; end; BEGIN Nhap; ChuanBi; Up; Down; TimDiemGay; Xuat; END procedure main; var i,j:integer; begin fillchar(ok,sizeof(ok),0); for i:=1 to n if tt[i]=0 then get_tree(i); {cay} for i:=1 to n if ok[i]=0 then get_tree(i);{chu trinh} close(f); end; procedure show; var start,finish,store_start,i:integer; begin (4) assign(f,fu); reset(f); assign(g,fo); rewrite(g); writeln(g,count); read(f,store_start); for i:=1 to count-1 begin readln(f,finish); read(f,start); writeln(g,finish,’ ’,start); end; readln(f,finish); writeln(g,finish,’ ’,store_start); close(f); close(g); end; Bài - Bày tranh const MaxN = 51; MaxM = 150; fi=’picture.inp’; fo=’picture.out’; type mang =array[0 MaxN,0 maxM] of byte; mang1 =array[0 MaxN,0 maxM] of integer; var f:text; n,m,lvtr,luumax,lk,ln:longint; c:array[0 maxN] of byte; v,tr,ltr:mang; s,ls:mang1; procedure int; var i,j:integer; begin assign(f,fi); reset(f); readln(f,n,m); for i:=1 to n read(f,c[i]); for i:=1 to n for j:=1 to m read(f,v[i,j]); close(f); assign(f,fo); rewrite(f); luumax:=0; end; {* *} procedure check_result(k:byte); var j,max,vtr,so:longint; begin max:=0; so:=n; if n=k then dec(so); for j:=1 to m if s[so,j] > max then begin max:=s[so,j]; vtr:=j;end; if max+c[k] > LuuMax then begin LuuMax:=max+c[k]; ls:=s; ltr:=tr; lvtr:=vtr; lk:=k; ln:=so; end; end; {* *} procedure process; var i,j,sl,k,u,start,finish,tri:integer; begin sl:=m-n+2; {so luong} for k:=1 to n begin fillchar(s,sizeof(s),0); for i:=1 to n if i<>k then begin start:=i; finish:=i+sl-1; if i>k then begin dec(start); dec(finish); end; for j:=start to finish for u:=start-1 to j-1 begin tri:=i-1; if i = k+1 then dec(tri); if s[i,j] begin s[i,j]:=s[tri,u]+v[i,j]; tr[i,j]:=u; end; end; end; check_result(k); end; end; {* *} procedure inkq(n,m:byte); var trn:byte; begin if n > then begin trn:=n-1; if n = lk+1 then dec(trn); inkq(trn,ltr[n,m]); write(f,m,’ ’); end; end; {* *} procedure print; var i,j:integer; begin writeln(f,luumax); writeln(f,lk); inkq(ln,lvtr); close(f); end; {* *} BEGIN int; process; print; END begin init; main; show; end Bài 1: Thẻ tín dụng Vào năm 21xx, tiền mặt trở thành món đồ cổ Người ta giao dịch hầu hết qua các thẻ tín dụng Hôm bạn tham quan nhà máy sản xuất thẻ Những thẻ sản xuất theo quy trình đặc biệt Nhà máy có máy tự động in thẻ, máy nhận đọc thẻ có ghi hai số nguyên dương và đưa thẻ theo nguyên tắc sau: Sau đọc thẻ có ghi cặp số (a, b), máy thứ (1) in thẻ có cặp số (a-b, b), máy thứ hai (2) in thẻ có cặp số (a+b, b) và máy thứ ba (3) in thẻ có cặp số (b, a) Do có lỗi khâu lập trình, toàn các thẻ sản xuất ngày trước bị ghi sai số Người ta phải tái chế lại các thẻ đó, rủi thay lập trình viên nhà máy nghỉ phép, bạn hãy lập trình giúp nhà máy Yêu cầu: Với thẻ (a, b) hãy tìm cách đổi thẻ thành (c, d) cách sử dụng loạt các thao tác trên các máy (1), (2) (3) thông báo thẻ đó bị hỏng không thể dùng các máy trên đổi Input: File The.Inp gồm dòng ghi số a b c d (1 ≤ a, b, c, d ≤ 2.10 9) Ouput: Ghi file The.Out thẻ bị hỏng thì ghi số -1, ngược lại ghi quy trình đổi thẻ dòng ghi số hiệu máy xử lý thẻ 1, tương ứng (5) Ví dụ: The.Inp 11 15 The.Out 2 3 Bài 2: Quan hệ Có N người mang tên tương ứng là 1, 2, , N và tình trạng quen biết N người này cho mảng đối xứng A[1 N,1 N] đó A[i,j] = A[j,i] = i quen j và i không quen j Hãy xét xem liệu có thể chia N người đó thành nhóm mà nhóm hai người bất kì không quen nhau? Dữ liệu vào cho file QHE.INP đó dòng thứ ghi số nguyên dương N <= 100, N dòng tiếp theo, dòng thứ i ghi N số A[i,1], , A[i,N] Kết ghi file QHE.OUT sau: oNếu không có thể , ghi -1 oNếu có thể, ghi hai dòng, dòng thứ tên người thuộc nhóm 1, dòng thứ hai tên người thuộc nhóm Ví dụ: QHE.INP QHE.OUT 11 01001100000 10100000000 01000000000 00001100100 10010000000 10010010000 00000100010 00000000110 00010001000 00000010001 00000000010 11 10 Bài 3: GRAY CODE Một hình tròn chia thành 2n hình quạt đồng tâm Hãy xếp tất các xâu nhị phân độ dài n vào các hình quạt, xâu vào hình quạt cho bất kì hai xâu nào hai hình quạt cạnh khác đúng bit Ưùng với n xuất khả khác Vd n=2 (hình 1) Hình input Output (gcode.out) N=2 00 10 11 01 ********** 00 01 11 10 Hình  Yeâu caàu ◦ Input : nhập từ bàn phím số n (1<n<=11) ◦ Output : Gcode.out  Mỗi xâu ghi trên dòng Giữa khả cách chuỗi ‘*************’ Câu 1: TÍNH TỔNG Trên màn hình lớn, người ta cho các số dãy gồm N số nguyên không âm a 1, a2, …, aN và lặp lặp lại Mỗi người theo dõi màn hình đề nghị tính tổng K số nguyên liên tiếp xuất trên màn hình số nguyên thứ B Viết chương trình giúp cho người theo dõi màn hình tính tổng đề nghị (6) Dữ liệu vào: chứa tệp văn SUM.INP gồm hai dòng + Dòng đầu tiên ghi ba số nguyên N, K và B,  N 100,  K 100,  B  109 + Dòng thứ hai chứa dãy số nguyên không âm a1, a2, …, aN Dữ liệu ra: ghi vào tệp văn SUM.OUT gồm dòng chứa tổng cần tính Ví dụ: SUM.INP SUM.OUT 154 24 Chương trình tham khảo: PROGRAM Tinh_Tong; CONST fi=’SUM.INP’; fo=’SUM.OUT’; VAR N, K, B, i : longint; S : longint; a : array[0 100] of longint; f: text; PROCEDURE DocFile; Var f: text; i: integer; Begin Assign(f, fi); Reset(f); Readln(f, N, K, B); For i:=0 to N Read(f, a[i]); Close(f) End; BEGIN Assign(f, fo); Rewrite(f); DocFile; S := 0; For i := B to B+K-1 S := S + a[(i-1) mod N]; Write(f, S); Close(f); END Câu 2: ĐẲNG THỨC Cho đẳng thức sai có dạng A=S (với A, S là hai số nguyên không âm) Viết chương trình tìm cách thêm vào các chữ số số nguyên A số phép cộng để nhận đẳng thức đúng, cho số phép cộng thêm vào là ít có thể Dữ liệu vào: chứa tệp văn EQ.INP gồm dòng là đẳng thức sai A = S Dữ liệu ra: ghi vào tệp văn EQ.OUT gồm dòng chứa đẳng thức đúng sau đã thêm vào các phép cộng Ví dụ: EQ.INP EQ.INP 143175=120 5025=30 EQ.OUT EQ.OUT 14+31+75=120 5+025=30 PROGRAM Dang_Thuc; CONST fi=’EQ.INP’; fo=’EQ.OUT’; inf = 1000000000; VAR n, S : longint; i, j : longint; ch : char; KQ: String; A : array[1 1000] of longint; B : array[1 1000] of longint; memo : array[1 1000,0 5000] of longint; PROCEDURE KhoiTao; Var f: text; Begin Assign(f, fi); Reset(f); n:=0; Read(f, ch); Repeat Inc(n); A[n]:= Ord(ch) – 48; Read(f, ch); Until ch=’=’; Readln(f, S); Close(f); B[n] := n; For i := n-1 downto if A[i] = then B[i] := B[i+1] else B[i] := i; For i := to n For j := to S memo[i,j] := -1; KQ:=’’; End; PROCEDURE GhiFile; Var f: text; Begin Assign(f, fo); Rewrite(f); Write(f, KQ); Close(f); End; FUNCTION Opt( i, sum : longint ) : longint; Var j, broj : longint; Begin if i > n then begin if sum = then opt := else opt := inf; end else begin if memo[i,sum] = -1 then begin memo[i,sum] := inf; broj := 0; (7) for j := B[i] to n begin broj := broj * 10 + A[j]; if broj > sum then break; if + opt( j+1, sum-broj ) < memo[i,sum] then memo[i,sum] := + opt( j+1, sum-broj ); end; end; Opt := memo[i,sum]; if i > then KQ:=KQ + '+'; broj := 0; for j := i to n begin KQ:=KQ + Chr(A[j]+48 ); broj := broj * 10 + A[j]; if opt( i, sum ) = + opt( j+1, sum-broj ) then begin Xuly( j+1, sum-broj ); break; end; end; end; End; BEGIN KhoiTao; Xuly(1, S ); GhiFile; END end; End; PROCEDURE Xuly( i, sum : longint ); Var f: text; j, broj : longint; Begin if i > n then begin KQ:=KQ + '=’+ Str(S ); end else begin Câu 3: TRẠM CANH Tại vùng đất nọ, người ta bố trí các trạm canh để cảnh báo nguy cho toàn vùng Mỗi trạm canh gồm có đài lửa và cung thủ trang bị số lượng tên định Khi có nguy xuất hiện, trạm định làm trạm xuất phát tự đốt lửa báo hiệu, sau đó người cung thủ trạm bắn tên để thắp lửa cho các trạm khác theo thị cho sẵn Đến lượt mình, trạm sau thắp lửa, người cung thủ trạm lại bắn tên để thắp lửa cho các trạm khác, theo thị cho sẵn Việc bắn tên cung thủ kết thúc đã sử dụng hết số tên cấp tất các trạm đã thắp lửa báo hiệu Xem vùng đất mặt phẳng toạ độ và trạm canh đặt toạ độ định Viết chương trình xác định thời điểm mà trạm thắp lửa báo hiệu Giả sử thời gian để cung thủ bắn tên thắp lửa cho trạm khoảng cách hai trạm (thời gian các loạt bắn là không đáng kể) và trạm số định là trạm xuất phát Ngoài ra, ta giả sử cung thủ luôn bắn trúng đích Dữ liệu vào: chứa tệp văn SPARK.INP có dạng sau: + Dòng đầu chứa số nguyên dương N (1  N 100) cho biết số trạm canh + N dòng dòng chứa N+2 số nguyên theo thứ tự cho biết các thông tin sau:  Hai số nguyên X, Y (1  X,Y 1000) cho biết toạ độ trạm  Số nguyên S (1  N 100) cho biết lượng cung tên cấp cho trạm  N-1 số nguyên cho biết thứ tự các trạm định cho người cung thủ phải bắn tên để thắp lửa Dữ liệu ra: ghi vào tệp văn SPARK.OUT gồm N dòng, dòng ghi thời điểm mà trạm tương ứng thắp lửa báo hiệu Các thời điểm ghi dạng số thập phân với độ chính xác đến 0.001 Ví dụ: SPARK.INP SPARK.OUT 0.000000 1 1.000000 3.000000 1 2.000000 2 Chương trình tham khảo: PROGRAM Tram_Canh; CONST fi=’SPARK.INP’; fo=’SPARK.OUT’; VAR n : longint; x, y, S : array[1 100] of longint; A : array[1 100,1 99] of longint; thoidiem : array[1 100] of real; daxet : array[1 100] of boolean; d : array[1 100,1 100] of real; PROCEDURE KhoiTao; Var f: text; i, j: integer; Begin Assign(f, fi); Reset(f); Readln(f, n); For i := to n begin read(f, x[i], y[i], S[i]); for j := to n-1 read(f, A[i,j]); thoidiem[i] := 1000000000; daxet[i] := false; end; Close(f); For i := to n for j := to n d[i,j] := sqrt( (x[i]-x[j])*(x[i]x[j]) + (y[i]-y[j])*(y[i]-y[j]) ); (8) thoidiem[1] := 0; End; PROCEDURE Xuly; Var i, j: integer; truoc_i, tiep : longint; Begin For i := to n begin truoc_i := 0; for j := to n begin if daxet[j] then continue; if truoc_i = then truoc_i := j; if thoidiem[j] < thoidiem[truoc_i] then truoc_i := j; end; daxet[truoc_i] := true; for j := to n-1 begin tiep := A[truoc_i,j]; if daxet[tiep] then continue; if thoidiem[truoc_i] + d[truoc_i,tiep] < thoidiem[tiep] then thoidiem[tiep] := thoidiem[truoc_i] + d[truoc_i,tiep]; S[truoc_i] := S[truoc_i] - 1; if S[truoc_i] = then break; end; end; End; PROCEDURE GhiFile; Var f: text; i: integer; Begin Assign(f, fo); Rewrite(f); For i:=1 to n Writeln(f, thoidiem[i]:10:10); Close(f); End; BEGIN KhoiTao; Xuly; GhiFile; END Câu (6 điểm) - Cặp số song sinh Hai số a, b gọi là cặp số song sinh dạng biểu diễn nhị phân thì hai số này không sai khác quá bit Yêu cầu: Cho trước hai số nguyên dương a và b (a, b nhỏ 1.000.000.000) Hãy kiểm tra hai số a, b có phải là cặp số song sinh hay không Input: File văn s3.inp cấu trúc sau: - Gồm số dòng (nhỏ 1.000.000); - Mỗi dòng chứa số cần kiểm tra; - Mỗi số trên dòng cách ít khoảng trắng Output: File văn s3.out cấu trúc sau: - Gồm dòng, là số đứng liền tạo thành dãy số nhị phân - Tính từ trái sang phải, kí tự thứ i là dòng thứ i file input chứa cặp số song sinh; Ngược lại kí tự vị trí thứ i là Ví dụ S3.inp S3.out 11 Câu (7 điểm) - Điền khuyết xâu kí tự Cho trước xâu ký tự a, b (chiều dài xâu không quá 100) Yêu cầu: Viết chương trình bổ sung số ký tự vào a và số ký tự vào b để hai xâu a và b trở nên giống (phân biệt chữ hoa, thường) Tổng số kí tự bổ sung vào là ít Input: File văn fs.inp cấu trúc sau: - Bao gồm số dòng (là số chẵn, có thể lên đến 10.000 dòng) - Mỗi dòng là xâu kí tự (không quá 100 kí tự) Output: File văn fs.out cấu trúc sau: - Gồm số dòng (là số dòng file input chia 2) - Dòng thứ i chứa xâu kí tự là kết việc bổ sung xâu dòng thứ i*2-1 và i*2 trên file input Ví dụ: Fs.inp Abcde Abcdef Abdf Câu (7 điểm) - Dãy đặc biệt Dãy số an cho trước gọi là dãy đặc biệt thỏa điều kiện : - n là số chính phương; - Các phần tử an đôi khác nhau; (9) Các phần tử an có thể xếp vào ma trận vuông A √ n để A √ n tạo thành ma phương Chú ý: Ma phương là ma trận vuông có tính chất sau: tổng các phần tử trên dòng tổng các phần tử trên cột và tổng các phần tử trên đường chéo Yêu cầu: Cho dãy an (với -10.000 < < 10.000; n là số nguyên dương nhỏ 3000) Viết chương trình kiểm tra xem dãy an có phải là dãy đặc biệt hay không Nếu phải thì hãy xuất ma phương còn không phải thì xuất dòng chữ “khong phai day dac biet” Input: file văn ddb.inp Dòng đầu tiên chứa số n Dòng chứa n số là các phần tử dãy Mỗi số cách ít khoảng trắng Output: file văn ddb.out Dòng đầu tiên chứa số m là cấp ma phương là chứa dòng chữ “khong phai day dac biet” Nếu dòng đầu tiên chứa số m thì m dòng dòng chứa m số là lượt là các phần tử ma phương (mỗi số cách khoảng trắng) Ví dụ: ddb.inp ddb.out khong phai day dac biet 24356 (Vì n không phải là số chính phương) - Bài 2: Var a:array[0 100,0 100] of byte; If (s1[i] = s2[j]) and (a[i,j] = a[i-1,j-1]+ 1) then s1,s2,s3,s4:string; Begin i,j:byte; s3:=s1[i]+s3; Begin dec(j); dec(i); s1:='121212qqw12121212'; End else s2:='121wer21212121212'; If a[i,j] = a[i-1,j] then dec(i) else dec(j); s3:=''; End; For i:=0 to length(s1) Until (i*j=0); a[0,i]:=0; s4:=''; For i:=1 to length(s2) For i:=1 to length(s3) a[i,0]:=0; Begin For i:=1 to length(s1) s4:=s4+ copy(s1,1,pos(s3[i],s1)-1); For j:=1 to length(s2) delete(s1,1,pos(s3[i],s1)); Begin s4:=s4+ copy(s2,1,pos(s3[i],s2)-1); If s1[i]=s2[j] then a[i,j]:= a[i-1,j-1]+1 else delete(s2,1,pos(s3[i],s2)); If a[i-1,j]>a[i,j-1] then a[i,j]:= a[i-1,j] s4:=s4+s3[i]; Else a[i,j]:= a[i,j-1]; End; End; s4:=s4+s1+s2; i:= length(s1); Write(s4); j:= length(s2); Readln; Repeat end Begin Bài 1: LSFIGHT (10đ)Trong kỳ thi năm các thí sinh phải tham gia môn thi đấu đối kháng người Sau vòng loại, ban tổ chức chọn N thí sinh có số điểm cao và đánh số từ đến N Các thí sinh này phải xếp theo thứ tự thành vòng tròn (người thứ N đứng cạnh người thứ 1) Sau đó chọn thí sinh bất kì đứng cạnh vòng tròn để thi đấu, thí sinh nào thua bị loại và buộc phải vòng tròn, trở hàng ghế khán giả Cuộc đấu tiếp tục đến còn người lại và chính là người thắng Yêu cầu: Ban tổ chức muốn biết trước xem có bao nhiêu người có khả thắng và đó là người nào Biết trước thắng trận đấu, bạn hãy giúp ban tổ chức Dữ liệu vào: LSFIGHT.INP - Dòng đầu là số nguyên dương N (3<=N<=500) - N dòng sau là ma trận A[i, j], A[i, j] = thí sinh i thua thí sinh j và A[i, j] = ngược lại Biết luôn đảm bảo A[i, i]=1 với i và A[i, j] + A[j, i] = với i <> j Các số viết cách ít dấu cách Kết quả: LSFIGHT.OUT - Dòng đầu là số nguyên dương M - số lượng thí sinh có khả thắng - M dòng sau dòng ghi số là số thí sinh có khả thắng theo thứ tự tăng dần số Time: 1s Ví dụ: LSFIGHT.INP 1111101 0101100 0111111 LSFIGHT.OUT 3 (10) 0001101 0000101 1101111 0100001 Chương trình: const fi='LSFIGHT.INP'; fo='LSFIGHT.OUT'; maxn=501; var f:text; i,j,k,n,sl,sn:word; duoc:array[0 maxn]of boolean; a:Array[0 maxn,0 maxn]of byte; procedure input; begin assign(f,fi); reset(f); readln(f,n); for i:=1 to n begin for j:=1 to n read(f,a[i,j]); readln(f); end; close(f); end; procedure solve; begin fillchar(duoc,sizeof(duoc),false); for i:=1 to n for j:=1 to n for k:=1 to n if (a[i,j]=0)and(a[i,k]=1)and(a[k,j]=1) then a[i,j]:=1; end; procedure output; begin assign(f,fo); rewrite(f); for i:=1 to n begin sl:=0; for j:=1 to n if a[i,j]=1 then inc(sl); if sl=n then begin inc(sn);duoc[i]:=true;end; end; writeln(f,sn); for i:=1 to n if duoc[i] then writeln(f,i); close(f); end; begin input; solve; output; end BÀI 2: COMBINE (10đ) Có n đoạn dây xích (N≤20000), đoạn dây xích là chuỗi các mắt xích nối với Các đoạn dây xích này tách rời Mỗi đoạn xích có không quá 20000 mắt xích Bằng cách cắt mắt xích, sau đó hàn lại, ta có thể nối hai dây xích thành đoạn Thời gian để cắt và hàn mắt xích là đơn vị thời gian và xem với mắt xích Yêu cầu: Hãy tính thời gian ngắn để nối N đoạn dây xích thành đoạn Dữ liệu vào: COMBINE.INP Dòng đầu ghi số N Dòng thứ ghi N số nguyên dương, số là độ dài đoạn xích Kết quả: COMBINE.OUT Một số là thời gian ngắn tìm Time: 1s Ví dụ: COMBINE.INP COMBINE.OUT 5789 Chương trình: const fi='combine.inp'; begin assign(f,fo); fo='combine.out'; l:=d;r:=c;mid:=a[(d+c)div 2]; rewrite(f); maxn=20001; repeat tong:=0; var f:text; while a[l]<mid inc(l); for i:=1 to n i,n:word; while a[r]>mid dec(r); begin tong:longint; if l<=r then inc(tong,a[i]); a:array[0 maxn]of word; begin if tong>=n-i-1 then break; procedure input; end; tam:=a[l];a[l]:=a[r];a[r]:=tam; begin if tong=n-i-1 then write(f,tong) inc(l);dec(r); assign(f,fi); else write(f,n-i); end; reset(f); close(f); until l>r; readln(f,n); end; if d<r then sort(d,r); for i:=1 to n read(f,a[i]); begin if l<c then sort(l,c); close(f); input; end; end; sort(1,n); procedure solve; procedure sort(d,c:word); solve; begin var l,r,tam,mid:word; end (11) Bài 1(10,0 điểm) - Số hình chữ nhật trên lưới Trên tờ giấy kẻ ô vuông, kích thước N x N người ta tạo số hình chữ nhật cách định vị số ô liên tiếp kề nhau, các hình chữ nhật này đôi không giao nhau, không liền kề theo phép kề đỉnh Cho bảng A (N x N), giá trị phần tử bảng xác định sau: A[i,j] = ô tương ứng trên tờ giấy thuộc hình chữ nhật nào A[i,j] = ô tương ứng trên tờ giấy không thuộc hình chữ nhật nào Hãy tìm số lượng các hình chữ nhật và các tọa độ đỉnh trái trên, phải hình chữ nhật bảng Dữ liệu vào lấy từ file văn “HCN.INP” dòng đầu ghi số N N dòng dòng là xâu nhị phân độ dài N, giá trị ô tương ứng thuộc hình chữ nhật, giá trị ô tương ứng không thuộc hình chữ nhật nào Kết ghi file văn “HCN.OUT” theo cấu trúc: - Dòng đầu ghi số M là số hình chữ nhật có bảng - M dòng dòng ghi số p, q, r, s với ý nghĩa: cặp số p, q là tọa độ đỉnh trái trên, cặp số r, s là tọa độ đỉnh phải hình chữ nhật M hình chữ nhật có trên bảng Ví dụ: HCN.INP HCN.OUT 1110011 1110011 0111000 1123 0111011 1627 0000011 3244 1111011 4667 1111000 6174 Bài 2(10,0 điểm) - Di chuyển từ trái sang phải Cho hình chữ nhật M x N ô vuông, ô chứa số nguyên Có thể di chuyển từ ô sang ô thuộc cột bên phải cùng dòng chênh lệch dòng Tìm cách di chuyển từ ô nào đó thuộc cột đến ô nào đó thuộc cột N cho tổng các số nguyên chứa các ô qua là nhỏ Dữ liệu vào lấy từ file văn “Dichuyen.inp” dòng đầu là số nguyên dương M, N M dòng dòng ghi N số nguyên hình chữ nhật Kết ghi file văn “Dichuyen.out” gồm dòng: - Dòng thứ ghi tổng các số nguyên chứa các ô qua - Dòng thứ hai ghi N số là số dòng các ô qua từ cột đến cột N Ví dụ: DICHUYEN.INP I Phần chương trình nguồn Bài 1: Var f:text; a: array[1 100,1 100] of 1; td: array[1 4,1 100] of byte; n, dem: byte; procedure docfile; var i, j : byte; ch: char; begin fillchar(a,sizeof(a),0); dem:=0; assign(f,'hcn.inp'); reset(f); readln(f,n); for i:=1 to n begin for j:=1 to n begin read(f,ch); if ch= '1' then a[i,j]:= 1; end; readln(f); Bài 2: DICHUYEN.OUT 2 end; close(f); end; procedure tim; var i,j,k,l,d,c:byte; begin for i:=1 to n for j:=1 to n if a[i,j]=1 then begin inc(dem); td[1,dem]:=i; td[2,dem]:=j; d:=i; c:=j; while (d<n) and (a[d+1,j]=1) inc(d); while (c<n) and (a[i,c+1]=1) inc(c); td[3,dem]:=d; td[4,dem]:=c; for k:=i to d for l:=j to c a[k,l]:=0; end; end; procedure vietfile; var i:byte; begin assign(f,'hcn.out'); rewrite(f); writeln(f,dem); for i:=1 to dem writeln(f,td[1,i],' ',td[2,i],' ',td[3,i],' ',td[4,i]); close(f); end; BEGIN docfile; tim; vietfile; END (12) uses crt; const maxmn = 100; fi = 'bt.inp'; fo = 'bt.out'; var a,t :array[0 maxmn,0 maxmn] of integer; kq :array[1 maxmn] of byte; m,n :byte; procedure doc_file; var f :text; i,j:byte; begin assign(f,fi); reset(f); readln(f,m,n); for i:=1 to m begin for j:=1 to n read(f,a[i,j]); readln(f); end; close(f); end; function min(i,j:byte):byte; var p: integer; d: byte; begin p:=a[i-1,j-1]; d:=i-1; if a[i,j-1]< p then begin Bài 1: Test HCN.INP HCN.OUT 1110011 1110011 1123 0111000 1627 0111011 3244 0000011 4667 1111011 6174 1111000 Test 1123 3244 11100 11100 01110 01110 00000 p:=a[i,j-1]; d:=i; end; if a[i+1,j-1]< p then begin p:=a[i+1,j-1]; d:=i+1; end; min:=d; end; procedure tao_nhan; var i,j,d : byte; begin for j:= to n a[0,j]:= maxint; for j:= to n a[m+1,j]:=maxint; fillchar(t,sizeof(t),0); for j:=2 to n for i:=1 to m begin d := min(i,j); a[i,j]:= a[d,j-1]+a[i,j]; t[i,j]:=d; end; end; procedure tim_duong; var i,j,d:byte; p :integer; f :text; Bài 2: Test 1: DICHUYEN.INP 523 432 Test 2: 5231 4320 1368 Test 3: 5 -3 1 -2 begin p:=maxint; for i:=1 to m if a[i,n]< p then begin d:=i; p:=a[1,n]; end; j:=n; i:=d; kq[j]:=d; assign(f,fo); rewrite(f); writeln(f,a[i,j]); while j>0 begin i:=t[i,j]; j:=j-1; kq[j]:=i; end; for j:=1 to n write(f,kq[j],' '); close(f); end; BEGIN doc_file; tao_nhan; tim_duong; END DICHUYEN.OUT 212 3222 32221 (13)

Ngày đăng: 22/06/2021, 10:38

Từ khóa liên quan

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

Tài liệu liên quan