1. Trang chủ
  2. » Luận Văn - Báo Cáo

De thi tin HSG Quang Ngai de 1

37 19 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

Thông tin cơ bản

Định dạng
Số trang 37
Dung lượng 39,62 KB

Nội dung

Trong mỗi bước di chuyển, một người chơi có thể di chuyển hình đến vị trí các ô liền kề lên trên, xuống dưới, sang trái, sang phải với ràng buộc rằng hình không thể di chuyển đến vị trí[r]

(1)SỞ GIÁO DỤC & ĐÀO TẠO KỲ THI CHỌN HỌC SINH GIỎI TỈNH – THPT QUẢNG NGÃI Năm học 2004-2005 Tên bài Tên chương trình Dữ liệu vào Kết BÀI Hoán vị thuận PERMUTE.PAS Bàn phím Màn hình BÀI Các ký tự LETTERS.PAS LETTERS.INP LETTERS.OUT Bài 1: hoán vị thuận Tên chương trình: PERMUTE.PAS Cho a = (a1, a2, , aN) là hoán vị dãy số tự nhiên N Ta xây dựng dãy b=(b 1,b2, ,bN) và gọi là thuận hoán vị a sau: Với i =1 N, bi là số lượng các phần tử nhỏ thua và đứng trước Ví dụ: N =7 ; a=(6,1,3,5,7,4,2) ta có thuận a là b=(0,0,1,2,4,2,1) a Cho N và hoán vị a Hãy tìm thuận a b Cho N và thuận b Hãy tìm hoán vị sinh thuận b Dữ liệu : vào từ bàn phím Đối với câu a: Nhập vào từ bàn phím: số N và hoán vị a Đối với câu b: Nhập vào từ bàn phím: số N và thuận b Kết quả: in màn hình Đối với câu a: in màn hình thuận a Đối với câu b: in màn hình hoán vị sinh thuận b Ví dụ: Nhập N = a = Thuận a là : 0 2 2 Nhập N = b=011241558 Hoán vị sinh thuận b: Bài 2: Các ký tự Tên chương trình: LETTERS.PAS Trò chơi mô tả sau: trên bảng hình chữ nhật chia R hàng và C cột có các ký tự chữ hoa (A-Z) viết trên ô bảng Trước bắt đầu trò chơi có hình góc trên bên trái bảng(hàng 1, cột 1) Trong bước di chuyển, người chơi có thể di chuyển hình đến vị trí các ô liền kề ( lên trên, xuống dưới, sang trái, sang phải) với ràng buộc hình không thể di chuyển đến vị trí ô này chứa ký tự đã xuất mà hình đã di chuyển qua Mục đích trò chơi là chơi để có nhiều bước di chuyển có thể Viết chương trình xác định số vị trí tối đa bảng mà hình có thể viếng thăm trò chơi Dữ liệu: Vào từ tập tin văn LETTERS.INP - Dòng thứ chứa hai số nguyên R và C, viết cách dấu cách, (1 ≤ R, C ≤ 20 ) - R dòng chứa, dòng chứa xâu ký tự Mỗi dòng biểu diễn hàng bảng Kết : Ghi vào tập tin văn LETTERS.OUT số nguyên là giá trị lớn các vị trí mà hình có thể di chuyển trên bảng Ví dụ: letters.inp 24 CAAB ADCB letters.out Bài ses crt; const MN=100; n=9; esc=#27; type mang=array[0 mn] of byte; var a, b : mang; procedure xemmang; var i:word; begin for i:=1 to n write(a[i]:3); end; procedure sinhhoanvi; var i,j, t : word; begin for i:=1 to n a[i]:=i; for i:=1 to n begin Bài 1111 ses crt; const MN=100; n=9; letters.inp 36 HFDFFB AJHGDH DGAGEH letters.out j:=random(n)+1; t:=a[1]; a[1]:=a[j]; a[j]:=t; end; end; procedure hvtt; var i,j:word; begin for i:=n downto for j:=1 to i if a[j]>=a[i] then dec(a[j]); end; procedure run; const bg=13; begin esc=#27; bg=13; clrscr; randomize; repeat sinhhoanvi; xemmang; b:=a; hvtt; writeln; write('Thuan the'); xemmang; writeln; until readkey=ESC; end; Begin run end type mang=array[0 mn] of byte; var a, b : mang; (2) end; procedure xemmang; var i:word; begin for i:=1 to n write(a[i]:3); end; procedure sinhhoanvi; var i,j, t : word; begin for i:=1 to n a[i]:=i; for i:=1 to n begin j:=random(n)+1; t:=a[1]; a[1]:=a[j]; a[j]:=t; end; end; procedure hvtt; var i,j:word; begin for i:=n downto for j:=1 to i if a[j]>=a[i] then dec(a[j]); Bài program letters; const INPUT_FILE = 'letters.in6'; OUTPUT_FILE = 'letters.out'; MAX_REDAKA = 20; MAX_STUPACA = 20; var broj_redaka,broj_stupaca : integer; ploca : array [1 MAX_REDAKA] of string[MAX_STUPACA]; bilo : array ['A' 'Z'] of boolean; broj_poteza,max_poteza : integer; f : text; procedure ucitaj_podatke; var i : integer; begin assign(f,INPUT_FILE); reset(f); readln(f,broj_redaka,broj_stupaca); for i := to broj_redaka readln(f,ploca[i]); close(f); begin clrscr; procedure tthv; randomize; var i, j : word; repeat begin writeln('Sinh ngau nhien mot hoan vi'); for i:=1 to n sinhhoanvi; for j:=i downto xemmang; if a[j] >=a[i] then inc(a[j]); b:=a; end; hvtt; writeln; function sanhmang(var a, b:mang):integer; writeln('Thuan the cua hoan vi la':bg); var i:word; xemmang; begin writeln; for i:=1 to n tthv; if a[i] <> b[i] then writeln; begin writeln('Tim lai hoan vi':bg); if a[i]>b[i] then sanhmang:=1 xemmang; else if sanhmang(a,b)<>0 then write('Sai') sanhmang:=-1; else writeln('Dung'); exit; until readkey=ESC; end; end; sanhmang:=0; end; Begin run procedure run; end const bg=13; end; procedure rekurzija(a,b : integer); begin if (a < 1) or (a > broj_redaka) or (b < 1) or (b > broj_stupaca) then exit; if bilo[ploca[a][b]] then exit; bilo[ploca[a][b]] := true; inc(broj_poteza); if broj_poteza > max_poteza then max_poteza := broj_poteza; rekurzija(a - 1,b); rekurzija(a + 1,b); rekurzija(a,b - 1); rekurzija(a,b + 1); bilo[ploca[a][b]] := false; dec(broj_poteza); end; procedure rijesi; var c : char; begin for c := 'A' to 'Z' bilo[c] := false; broj_poteza := 0; max_poteza := 0; rekurzija(1,1); end; procedure ispisi_rjesenje; begin assign(f,OUTPUT_FILE); rewrite(f); writeln(f,max_poteza); close(f); end; begin ucitaj_podatke; rijesi; ispisi_rjesenje; end Tên bài Tên chương trình Dữ liệu vào Kết BÀI Tháp Hà Nội TOWER.PAS Bàn phím Màn hình BÀI Cửa sổ WINDOWS.PAS WINDOWS.INP WINDOWS.OUT Bài : Tháp Hà nội Tên chương trình: TOWER.PAS Có cọc cắm vị trí 1, 2, hình Trên cọc thứ có chồng gồm n đĩa gỗ hình tròn to nhỏ khác xuyên lỗ tựa đồng xu và đặt chồng lên để tạo toà tháp Người chơi phải chuyển toà tháp từ cọc sang cọc 3, tuân thủ quy tắc sau: (1) Người chơi sử dụng vị trí thứ để đặt tạm các tầng tháp (2) Mỗi lần chuyển tầng tháp từ vị trí sang hai vị trí còn lại (3) Không đặt tầng tháp lớn trên tầng tháp nhỏ Hãy tìm cách giải bài toán trên với số lần chuyển đĩa là ít nhất, theo hai cách a Sử dụng phương pháp đệ quy b Sử dụng phương pháp khác (không dùng đệ quy) (3) Dữ liệu:: Kết quả: Nhập vào từ bàn phím số nguyên N , N ≤ 64 Xuất màn hình  Các bước chuyển Tổng số lần chuyển Ví dụ: N=3 Xuất màn hình : A > C A > B C > B A > C B > A B > C A > C Số lần chuyển : (A) (B) (C) Bài 4: Cửa sổ Tên chương trình: WINDOWS.PAS Hình Bài toán tháp Hà Nội Trong sử dụng số hệ điều hành phổ biến nay, chúng ta thường mở vài cửa sổ Mỗi cửa sổ là hình chữ nhật chứa các hình vuông nhỏ (có kích thước 1x1) Các cửa sổ đã mở phụ thuộc vào vị trí và kích thước nó, có thể phần toàn bao trùm lên cửa sổ đã mở sớm Chúng ta có thể đóng cửa sổ chuột máy tính, chúng ta kích chuột vào hình vuông nhỏ phía trên bên phải, giây lát cửa sổ đóng Hình vuông nhỏ cửa sổ hiển thị rõ ràng không có hình vuông nào mở sau nó mà chưa đóng Viết chương xác định số lần kích chuột nhỏ để đóng cửa sổ đã mở đầu tiên Dữ liệu: Vào từ tập tin văn Windows.inp - Dòng đầu tiên chứa số nguyên N, chính là số cửa sổ đã mở, ≤ N ≤ 100 - Trong N dòng tiếp theo, dòng chứa số nguyên R1, S1, R2 và S2, các số viết cách dấu cách, ≤ R1 ≤ R2 ≤ 10000, ≤ S1 ≤ S2 ≤ 10000 R1, S1 là hàng, cột trên màn hình hình vuông phía trên bên trái cửa sổ R2, S2 là hàng, cột trên màn hình hình vuông phía bên phải cửa sổ Các cửa sổ đã mở theo trật tự đã xuất tập tin liệu vào Chúng ta xem màn hình gồm các hàng, cột các hình vuông nhỏ Hàng đánh số từ trên xuống dưới, cột đánh số từ trái sang phải và hình vuông phía trên bên trái màn hình hàng 1, cột Kết quả: Ghi tập tin văn windows.out số lần kích chuột ít để đóng cửa sổ đầu tiên Ví dụ: windows.inp windows.inp windows.inp 3 3164 4163 3344 1246 2255 1122 2355 1436 5566 windows.out windows.out windows.out Bài type stackptr:=temp; sodia:=n; stack=^banghi; end; coc1:=1; banghi=record coc2:=2; sd:integer; Procedure pop(var coc3:=3; c1,c2,c3:integer; sodia,coc1,coc2,coc3:integer); dem:=0; next:stack; var Repeat end; temp:stack; while sodia<>0 var begin begin stackptr:stack; if stackptr<>nil then push(sodia,coc1,coc2,coc3); n, sodia:integer; begin t:=coc3; t,coc1,coc2,coc3:integer; temp:=stackptr; coc3:=coc2; dem:integer; with temp^ coc2:=t; Procedure begin sodia:=sodia-1; push(sodia,coc1,coc2,coc3:integer); sodia:=sd; end; var coc1:=c1; pop(sodia,coc1,coc2,coc3); temp:stack; coc2:=c2; writeln('Chuyen dia : ',sodia,' tu begin coc3:=c3; ',chr(coc1+64),' >',chr(coc3+64)); new(temp); end; dem:=dem+1; with temp^ stackptr:=stackptr^.next; if (sodia=1) and (stackptr<>nil) then begin dispose(temp); begin sd:=sodia; end; pop(sodia,coc1,coc2,coc3); c1:=coc1; end; writeln('Chuyen dia : ',sodia,' tu ', c2:=coc2; chr(coc1+64),' >',chr(coc3+64)); c3:=coc3; Begin dem:=dem+1; next:=stackptr; stackptr:=nil; t:=coc1; end; write('cho so dia can chuyen'); readln(n); coc1:=coc2; (4) coc2:=t; sodia:=sodia-1; end else begin t:=coc1; coc1:=coc2; coc2:=t; sodia:=sodia-1; end; Bài Program chuyendia; uses crt; var n:byte; f:text; T:longint absolute 0:$46C; t1,t2,dem:longint; procedure khoitao; begin write('Vao N : ');readln(n); assign(f,'kq.dat'); rewrite(f); dem:=0; end; procedure chuyen(N,A,C,B:byte); begin if N=1 then Bài program _windows; const INPUT_FILE = 'windows.in5'; OUTPUT_FILE = 'windows.out'; MAX_PROZORA = 100; var broj_prozora : integer; prozori : array [1 MAX_PROZORA] of record gornji_red,donji_red : integer; lijevi_stupac,desni_stupac : integer; end; zatvoren : array [1 MAX_PROZORA] of boolean; rjesenje : integer; f : text; procedure ucitaj_podatke; var i : integer; begin assign(f,INPUT_FILE); reset(f); readln(f,broj_prozora); for i := to broj_prozora SỞ GIÁO DỤC & ĐÀO TẠO QUẢNG NGÃI begin writeln(f,chr(A+64),' >',chr(C+64)); dem:=dem+1; end else begin chuyen(N-1,A,B,C); chuyen(1,A,C,B); chuyen(N-1,B,C,A); end; end; procedure thuchien; begin t1:=t; chuyen(n,1,3,2); t2:=t; writeln('Thoi gian chay chuong trinh ',(t2t1)*18.2:10:10); write(f,'so lan chuyen ',dem); write('so lan chuyen ',dem); close(f); readln; end; BEGIN clrscr; khoitao; thuchien; END if not zatvoren[i] and preklapa(i,broj) readln(f,prozori[i].gornji_red,prozori[i].lij then zatvori(i); evi_stupac, zatvoren[broj] := true; prozori[i].donji_red,prozori[i].desni_stupa inc(rjesenje); end; c); close(f); procedure rijesi; end; var i : integer; function preklapa(a,b : integer) : boolean; begin begin for i := to broj_prozora if (prozori[a].gornji_red <= zatvoren[i] := false; prozori[b].gornji_red) and rjesenje := 0; (prozori[a].donji_red >= zatvori(1); prozori[b].gornji_red) and end; (prozori[a].lijevi_stupac <= prozori[b].desni_stupac) and procedure ispisi_rjesenje; (prozori[a].desni_stupac >= begin prozori[b].desni_stupac) then assign(f,OUTPUT_FILE); preklapa := true rewrite(f); else writeln(f,rjesenje); preklapa := false; close(f); end; end; procedure zatvori(broj : integer); begin var ucitaj_podatke; i : integer; rijesi; begin ispisi_rjesenje; for i := broj_prozora downto broj + end KỲ THI CHỌN HỌC SINH GIỎI TỈNH – THPT Năm học 2004-2005 Bài 1: (10 điểm) Test : điểm Test : điểm Test : điểm Test : 2,5 điểm Test 5: 3,5 điểm Hoán vị 217654389 Thuận 002222278 Hoán vị sinh thuận 217654389 Hoán vị Until sodia=0; write('So lan chuyen ',dem); readln; END 273456819 (5) Thuận Hoán vị sinh thuận 011234608 273456819 Hoán vị Thuận Hoán vị sinh thuận 11 10 00002543780 11 10 Hoán vị Thuận Hoán vị sinh thuận 11 10 15 14 12 13 0 1 5 9 10 11 10 15 14 12 13 Hoán vị 11 10 16 12 18 13 14 19 17 15 20 Thuận 0 1 5 9 10 Hoán vị sinh thuận 11 10 16 12 18 13 14 19 17 15 20 Nếu đúng câu a b thì cho ½ số điểm test tương ứng Bài 2: (10 điểm) Chấm theo test gồm : test Test 1: điểm Test 2: điểm Test 3: Test 4: điểm Test điểm Test Test Test Test letters.inp letters.inp letters.inp 24 36 55 CAAB HFDFFB IEFCJ ADCB AJHGDH FHFKC DGAGEH FFALF HFGCF HMCHH letters.out letters.out letters.out 10 Test letters.inp 10 D A C B B E B A B F letters.out BÀI BÀI Tên bài Phân tích Máy bay điểm điểm Test letters.inp 89 QDTCYRNEF MFKGIJAXZ XAGVNZYGR PPYUUPFKG JEQVKFEWU HCBRUZQPJ YOVJVILYU INXATSXKE Test letters.inp 20 LMLINHDKMALNNLBCACLA AGEHCEDKOGNIBFHFNHLI HCJBIGKBJBELCHCJCLOF letters.out 24 letters.out 14 Tên chương trình SUM.PAS AIRPLANE.PAS Dữ liệu vào SUM.IN AIRPLANE.IN Kết SUM.OU AIRPLANE.OU Bài 3: Tính tổng Tên chương trình: SUM.PAS Cho số nguyên dương S và tập A gồm N số nguyên dương a1, a2, aN, đôi khác và a1=1 Ta biết S có thể viết thành tổng các phần tử tập A Hãy cho biết tổng này chứa ít là bao nhiêu số hạng Ví dụ: Với S=14 và tập A gồm phần tử là 1, 2, 3, 5, , 10 thì có thể viết S theo nhiều phương án sau: S = + + + 10 ( số hạng ) S = + + 10 ( số hạng ) S=7+7 ( số hạng ) đó phương án thứ là tối ưu vì dùng số hạng Dữ liệu vào: tập tin văn SUM.IN, gồm: - Dòng đầu tiên là hai số nguyên dương S và n - Tiếp đến là giá trị a1, a2, , aN có thể viết trên nhiều dòng Các số viết cách ít dấu cách ≤ S ≤ 10000, ≤ N ≤ 100, a1=1 , dãy A tăng với các phần tử đôi khác Kết quả: Ghi vào tập tin văn SUM.OU số nguyên dương k là số số hạng tối thiểu tổng biểu diễn S sum.in 14 sum.ou (6) 10 Bài 4: Máy bay Tên tập tin chương trình: AIRPLANE.PAS Hình ảnh máy bay với lối vào hành lang xuyên qua tất các hàng ghể và hành khách Hành khách bước vào hành lang và tìm chỗ ngồi họ Mỗi hành khách phải ngồi đúng ghế mình và lối vào đến máy bay hàng ghế đầu tiên phía trước Hành khách bước vào máy bay theo người, không có dừng lại không cần thiết Hành khách vào hành lang theo hướng ghế mình và hàng ghế hành khách dừng lại đúng giây (hoặc lâu phía trước họ là hành khách khác) hành khách đến đúng hàng ghế mình và hành khách dừng lại hàng ghế mình giây (để cất, đặt hành lý) Trong giây hành lang, hàng có thể có hành khách Yêu cầu: Viết chương trình tính tất thời gian cần thiết để hành lang máy bay không còn hành khách, điều này có nghĩa là tất hành khách đã ngồi vào ghế họ Dữ liệu vào: vào từ tập tin văn airplane.in: - Dòng đầu tiên ghi số nguyên N , là số hành khách, ≤ N ≤ 1000 - Dòng i+1 chứa số nguyên Ri là số hàng ghế mà đó hành khách thứ i phải ngồi, 1≤ Ri ≤ 1000 Hành khách đánh số từ đến N và họ vào theo trật tự đó Số lượng hành khách ngồi trên cùng hàng là không có giới hạn Kết quả: ghi vào tập tin văn airplane.ou là số nguyên T (tính giây), là thời gian cần thiết để tất hành khách ngồi vào ghế họ Ví dụ: Airplane.in Airplane.ou Bài ses crt; const fn = 'sum.in'; gn = 'sum.ou'; hn = 'sum.ts'; mn = 10000; bl = #32; sotest = 5; dapso : array[1 sotest] of integer = (4,9,2,11,69); type ii = integer; mw1 = array[0 mn+1] of ii; var f,g: text; n,s:ii; ch: char; a,d: mw1; soloi: ii; diemtest: array[1 sotest] of ii; tongdiem: ii; bailam:ii; procedure xem(var x: mw1); var i:ii; begin writeln; writeln(s,bl,n); for i:=1 to n write(x[i],bl); end; procedure doc; var i,x: ii; begin assign(f,fn+ch); reset(f); readln(f,s,n); for i:=1 to n read(f,a[i]); close(f); end; Airplane.in 4 Airplane.ou 19 procedure tinh(i: ii); var j,mind: ii; begin mind:=maxint; for j:=1 to n if i >= a[j] then if mind > d[i-a[j]] then mind := d[i-a[j]]; d[i]:=mind + 1; end; procedure xl; var i: ii; begin fillchar(d,sizeof(d),0); d[0]:=0; d[1]:=1; for i:=2 to s tinh(i); end; procedure ten(t: byte); begin ch:=chr(ord('0')+t); end; procedure ghi(tf: string); var i: ii; begin assign(g,tf+ch); rewrite(g); writeln(g,d[s]); close(g); end; procedure run(t: byte); begin ten(t); doc; xl; ghi(gn); end; procedure rr; var t: ii; begin for t:=1 to sotest run(t); end; procedure err(e: ii); begin inc(soloi); writeln;write('Loi ',e,': '); case e of 1: writeln('Khong mo duoc tep ket qua ',gn+ch); 2: writeln('Sai dap so '); end; end; procedure kiemtra(t:ii); var i,j: ii; begin assign(g,gn+ch); {$I-} reset(g);{$I+} if ioresult <> then begin err(1); exit end; readln(g,bailam); writeln('*** Dap an: ', dapso[t],' Bai lam: ',bailam); if dapso[t] = bailam then diemtest[t]:=10 else err(2); close(g); end; (7) procedure test(t:ii); begin writeln(' Test No ',t); diemtest[t]:=0; soloi:=0; ten(t);kiemtra(t); write('Diem test No ',t,': ',diemtest[t]); readln; end; procedure thoat; var t:ii; begin for t:=1 to sotest begin ten(t); assign(g,gn+ch); {$I-} reset(g);{$I+} if ioresult = then begin writeln(' Xoa tep ',gn+ch); erase(g); end; end; end; procedure alltest; var t:ii; begin fillchar(diemtest,sizeof(diemtest),0); tongdiem:=0; for t:=1 to sotest begin test(t); inc(tongdiem,diemtest[t]); end; writeln; writeln(' T O N G D I E M : ',tongdiem); end; procedure tt; var t: ii; begin repeat writeln; writeln(' ****** T E S T C L A S S ******'); writeln(' exit'); Bài program airplane; const INPUT_FILE = 'air4.in'; OUTPUT_FILE = 'air4.ou'; MAX_PUTNIKA = 1000; MAX_REDOVA = 1000; var broj_putnika,broj_redova : integer; cilj : array [0 MAX_PUTNIKA] of integer; rjesenje : integer; f : text; end; close(f); end; function max3(a,b,c : integer) : integer; begin if (a > b) and (a > c) then max3 := a else if b > c then max3 := b else max3 := c; end; procedure ucitaj_podatke; var i : integer; begin assign(f,INPUT_FILE); reset(f); readln(f,broj_putnika); {so hanh khach} broj_redova := 1; for i := to broj_putnika begin readln(f,cilj[i]); if cilj[i] > broj_redova then broj_redova := cilj[i]; procedure rijesi; var i,j : integer; redovi : array [0 MAX_REDOVA] of integer; begin for i := to broj_redova redovi[i] := 0; for i := to broj_putnika {so hk} begin for j := to cilj[i] - SỞ GIÁO DỤC & ĐÀO TẠO QUẢNG NGÃI BÀI BÀI Tên bài Phân lớp Palindrome writeln(' ',sotest,' Thuc hien Test'); writeln(' > ',sotest,' Thuc hien du ',sotest,' tests'); writeln; repeat write('CHON: ',sotest+1,': '); readln(t); until (t >= 0) and ( t <= sotest+1); case t of 0: thoat; sotest: test(t); sotest+1: alltest; end; until t = 0; end; begin clrscr; rr; tt; writeln('fini'); readln; end redovi[j] := max3(redovi[j - 1] + 1,redovi[j] + 1,redovi[j + 1]); redovi[cilj[i]] := max3(redovi[cilj[i] 1],redovi[cilj[i]],0) + 5; end; rjesenje := redovi[1]; for i := to broj_redova if redovi[i] > rjesenje then rjesenje := redovi[i]; end; procedure ispisi_rjesenje; begin assign(f,OUTPUT_FILE); rewrite(f); writeln(f,rjesenje); close(f); end; begin ucitaj_podatke; rijesi; ispisi_rjesenje; end KỲ THI CHỌN ĐỘI TUYỂN HSG TỈNH - THPT Năm học 2004-2005 Tên chương trình CLASS.PAS` PALINDR.PAS Dữ liệu vào CLASS.IN PALINDR.IN Kết CLASS.OU PALINDR.OU Bài 1: Phân lớp (10 điểm) Tên chương trình: CLASS.PAS Gọi S(x) là số ước số nguyên dương x Hai số nguyên dương x và y gọi là hai số cùng lớp k S(x) = S(y) = k Ví dụ: S(6) = vì có bốn ước là 1, 2, 3, và S(8) = S(7) = (8) S(13) = Như vậy, và là hai số thuộc lớp , và 13 là hai số thuộc lớp Cho N số nguyên dương a1, a2, , aN Hãy cho biết: a Các số đã cho chia thành bao nhiêu lớp khác b Số lượng phần tử lớp là bao nhiêu? Dữ liệu vào: Vào từ tập tin văn CLASS.IN: Dòng đầu tiên ghi số nguyên N, ≤ N ≤ 1000 Tiếp đến là N số nguyên dương a1, a2, ,aN, có thể viết trên nhiều dòng, số viết cách ít dấu cách, ≤ ≤ 65530 Kết quả: Đưa tập tin văn bản: Dòng đầu tiên là số lớp S tìm Tiếp đến là S dòng, dòng chứa hai giá trị k và d , đó k là số ước các số lớp, d là số phần tử có lớp k Mỗi số cách ít dấu cách class.in class.ou 13 23 78 42 Bài 2: Palindrome (10 điểm) Tên chương trình: PALINDR.PAS Palindrome là xâu ký tự mà đọc nó từ trái sang phải từ phải sang trái ta cùng xâu Một xâu ký tự luôn có thể biểu diễn là dãy các palindrome ta coi xâu gồm ký tự luôn là palindrome Ví dụ: Xâu ‘bobseesanna’ có thể biểu diễn dạng dãy các palindrome theo nhiều cách, chẳng hạn: ‘bobseesanna’ = ‘bob’ + ‘sees’ + ‘anna’ ‘bobseesanna’ = ‘bob’ + ‘s’ + ‘ee’ + ’s’ + ‘anna’ ‘bobseesanna’ = ‘b’ +’o’ + ‘b’ + ‘sees’ + ‘a’ + ‘n’ + ‘n’ + ‘a’ Yêu cầu: Cho xâu ký tự s, cần tìm cách biểu diễn xâu s dạng dãy gồm số ít các palindrome Ví dụ: Cho s=‘bobseesanna’, ta có ‘bobseesanna’ = ‘bob’ + ‘sees’ + ‘anna’ và không thể biểu diễn ‘bobseesanna’ ít là palindrome nên biểu diễn này chính là biểu diễn cần tìm Dữ liệu vào: Vào từ tập tin văn PALINDR.IN, gồm dòng chứa xâu ký tự s gồm không quá 255 ký tự Kết quả: Đưa tập tin văn PALINDR.OU: Dòng đầu tiên ghi k là số lượng ít các palindrome biểu diễn tìm được; Dòng thứ i số k dòng ghi palindrome pi (i=1, 2, , k) cho s = p1p2 pk PALINDR.IN PALINDR.OU PALINDR.IN PALINDR.OU bobseesanna aabbaaaabb bob aa sees bbaaaabb anna Bài uses crt; const fn = 'class.in'; gn = 'class.ou'; hn = 'class.ts'; mn = 1000; bl = #32; sotest = 5; type ww = word; mw1 = array[0 mn+1] of ww; var f,g: text; n,solop,solophs:ww; ch: char; a,u,d,spt,su: mw1; soloi: ww; diemtest: array[1 sotest] of ww; tongdiem: ww; spths,souochs:ww; procedure xem(var x: mw1); (9) (10) (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) (21) (22) (23) (24) (25) (26) (27) (28) (29) (30) (31) (32) (33) (34) (35) (36) begin inc(solop); su[solop]:=u[i]; inc(spt[solop]); for j:=i+1 to n if head(j) = i then inc(spt[solop]); end; end; procedure ten(t: byte); begin ch:=chr(ord('0')+t); end; procedure ghi(tf: string); var i: ww; begin assign(g,tf+ch); rewrite(g); writeln(g,solop); for i:=1 to solop writeln(g,su[i],bl,spt[i]); close(g); end; procedure run(t: byte); begin ten(t); doc; xl; ghi(gn); end; procedure runtest(t: byte); begin ten(t); doc; xl; end; procedure rr; var t: ww; begin for t:=1 to sotest run(t); end; procedure err(e: ww); begin inc(soloi); writeln;write('Loi ',e,': '); case e of 1: writeln('Khong mo duoc tep ket qua ',gn+ch); 2: writeln('Sai so lop '); 3: writeln('Sai lop, so uoc '); end; end; function timlop(suhs:ww):ww; var i:ww; begin timlop:=0; for i:=1 to solop if d[i]=0 then if su[i] = suhs then begin d[i]:=1; if spths <> spt[i] then exit; timlop:=i; exit; end; end; procedure kiemtra(t:ww); var i,j: ww; begin assign(g,gn+ch); {$I-} reset(g);{$I+} if ioresult <> then begin err(1); exit end; fillchar(d,sizeof(d),0); read(g,solophs); writeln('SO LOP *** Dap an: ', solop,' Bai lam: ',solophs); if solop = solophs then inc(diemtest[t],5) else begin err(2); if solophs > solop then begin close(g);exit end; end; for i:=1 to solophs begin read(g,souochs,spths); if timlop(souochs) = then begin err(3); close(g); exit end; end; close(g); inc(diemtest[t],5); end; procedure test(t:ww); begin writeln(' Test No ',t); runtest(t); diemtest[t]:=0; soloi:=0; kiemtra(t); write('Diem test No ',t,': ',diemtest[t]); readln; end; procedure thoat; var t:ww; begin for t:=1 to sotest begin ten(t); assign(g,gn+ch); {$I-} reset(g);{$I+} if ioresult = then begin writeln(' Xoa tep ',gn+ch); erase(g); end; end; end; procedure alltest; var t:ww; begin fillchar(diemtest,sizeof(diemtest),0); tongdiem:=0; for t:=1 to sotest begin test(t); (37) inc(tongdiem,diemtest[t]); end; writeln; writeln(' T O N G D I E M : ',tongdiem); end; procedure tt; var t: ww; begin repeat Bài program PalindromStrings; const inpf outf maxli infinite var si prev, v integer; li = 'palindr.in2'; = 'p.o'; = 255; = 1000; : string; : array[0 maxli + 1] of writeln; writeln(' ****** T E S T C L A S S ******'); writeln(' exit'); writeln(' ',sotest,' Thuc hien Test'); writeln(' > ',sotest,' Thuc hien du ',sotest,' tests'); writeln; repeat write('CHON: ',sotest+1,': '); readln(t); until (t >= 0) and ( t <= sotest+1); case t of 0: thoat; sotest: test(t); sotest+1: alltest; end; until t = 0; end; function palindrome(s, t : integer) : boolean; var i : integer; end; end; begin for i := s to (s + t) div if si[i] <> si[s + t - i] then begin palindrome := false; exit; end; palindrome := true; end; : integer; procedure solve; var i, j : integer; procedure init; var f : text; begin tmp : string; v[1] := 0; i : integer; for i := to li + v[i] := infinite; begin assign(f, inpf); fillchar(prev, sizeof(prev), 0); reset(f); readln(f, si); for i := to li begin close(f); for j := li downto i li := length(si); if si[i] = si[j] then tmp := si; if v[j + 1] > v[i] + then for i := to li si[i] := tmp[li - i + 1]; if palindrome(i, j) then begin end; prev[j + 1] := i; v[j + 1] := v[i] + 1; end; begin clrscr; rr; { tt;} writeln('fini'); end procedure done; var f : text; i, j, k : integer; begin assign(f, outf); rewrite(f); writeln(f, v[li + 1]); if li > then begin i := li + 1; while i > begin j := prev[i]; for k := j to i - write(f, si[k]); writeln(f); i := j; end; end; close(f); end; begin init; solve; done; end (38)

Ngày đăng: 17/06/2021, 22:36

TỪ KHÓA LIÊN QUAN

w