Giai de thi HSG tinh nghe an 20112012

6 33 0
Giai de thi HSG tinh nghe an 20112012

Đang tải... (xem toàn văn)

Thông tin tài liệu

Thuật toán cụ thể như sau: (Thuật Toán này chúng ta dùng đề tìm hiểu, không phải là thuật toán tối ưu đâu nhé). Program SoNguyenToDoiXung; Var[r]

(1)

ĐỀ HỌC SINH GIỎI TỈNH NGHỆ AN NĂM 2011-2012 MÔN TIN HỌC

(Chú ý: Mọi chương trình tách modun nhằm chúng ta hiểu thuật tốn, nên khơng có tối ưu thuật toán để giảm thời gian hay dư thừa liệu

Quý vị có nhiều cách giải hay hơn) Bài 1: Nén xâu

Mợt xâu kí tự nén lại thành một xâu cách nén kí tự giống đứng cạnh Ví dụ xâu AAAA sẽ nén thành 4A Hãy lập trình để nén xâu kí tự in hoa theo cách

Dữ liệu: vào từ file văn NENXAU.INP một xâu, mà kí tự là chữ in hoa

Kết quả: ghi vào file văn NENXAN.OUT một xâu kí tự sau nén VD:

Nenxau.inp Nenxau.out

NNNAAAAFGGH 3N4AF2GH

Ở bài này có nhiều cách giải Mình đưa cách giải sau:

- Nhóm phần tử giống lại và tính chiều dài xâu

- Nhóm cuối có số phần tử “bằng” “khơng bằng” Nên phải xử lý riêng

Thuật toán: Xâu cần nén là xâu ST

- Đầu tiên tạo xâu có phần tử (S) (chính là ký tự xâu cần nén (St)) S:=St[1];

- Duyệt từ phần tử thứ đến phần tử cuối cùng: for i:=2 to length(st) + Gặt phần tử xét St[i] bàng S[1] cợng vào xâu S

+ Nếu St[i] <> S[1]  Đã hết đoạn ký tự trùng (Xâu S gồm phần tử giống nhau)  Lưu lại độ dài xâu S vào tệp + ký tự xâu S; Tiến hành khởi tại lại xâu S:=St[i] (Bắt đầu đoạn mới)

for i:=2 to length(st) do

if St[i]=S[1] then S:=S+St[i] else

Begin

(2)

- Đoạn cuối xâu St (nếu có nhiều PT giống nhau) if length(s)=1 then write(f,S)

else write(f,length(s),S[1]); Chương trình hoàn chỉnh

Program NenXau; Var St:string;

Procedure Docfile; var f:text;

Begin

assign(f,'nenxau.inp'); reset(f); readln(f,st);

close(f); End;

Procedure XuLy; var f:text;

s:string; i:byte; Begin

assign(f,'nenxau.Out'); rewrite(f);

s:=st[1];

for i:=2 to length(st)

if St[i]=S[1] then S:=S+St[i] else

Begin

if length(s)>1 then write(f,length(s)); write(f,S[1]);

S:=St[i]; End;

if length(s)=1 then write(f,S) else write(f,length(s),S[1]); close(f);

End; Begin

(3)

Bài 2: Số nguyên tố đối xứng

Một số nguyên dương T gọi là số nguyên tố đối xứng nếu thỏa mãn yêu cầu sau:

- T là một số nguyên tố

- T là một số đối xứng (đọc T từ trái qua phải thu kết giống đọc T từ phải qua trái) Ví dụ 12321 là số đối xứng

Yêu cầu: cho số nguyên dương A và B, hãy tìm số lượng số nguyên tố đối xứng T thỏa mãn A ≤ T ≤ B 100000

Dữ liệu: vào từ file văn NTDX.INP gồm dòng chứa số nguyên dương A và B cách dấu cách (104 ≤ A < B <105)

Kết quả: ghi vào file văn NTDX.INP một số nguyên là số lượng số nguyên tố tìm

VD

NTDX.inp NTDX.out

11111 22222 23

Bài này nếu tạo Hàm kiểm tra Tính nguyên tố và Số Đối xứng để kiểm tra tất số đoạn A B có thoả mản là số Nguyên Tố đối xứng không

Hàm NguyenTo quyen tḥc rất nhiều Hàm Số đối xứng có nhiều cách:

Có thể dùng Xâu, tệp, đơn giản nhất là đối thành mợt số ngun khác Thuật tốn cụ thể sau: (Thuật Toán này dùng đề tìm hiểu, khơng phải là thuật tốn tới ưu đâu nhé)

Program SoNguyenToDoiXung; Var

A,B:longint; Procedure Docfile; var f:text;

Begin

assign(f,'ntdx.INp'); reset(f); readln(f,A,B);

close(f); End;

Function Nt(n:longint):boolean; var i:longint;

(4)

End;

Function DoiXung(N:longint):boolean; var

N1,N2:longint; Begin

N1:=0; N2:=N;

while N<>0 begin

N1:=N1*10+ N mod 10; N:=N div 10

End;

DoiXung:=N1=N2; End;

Procedure XuLy; var i:longint;

d:longint; f:text; Begin

d:=0;

for i:= A to B

if NT(i) and DoiXung(i) then inc(d); assign(f,'NTDX.OUT'); Rewrite(f);

write(f,d); close(f); End;

Begin

(5)

Bài 3: DÃY SỐ TƯƠNG THÍCH

Cho dãy số nguyên{aN} , {bN}(1<N≤10000, 1≤ai,bi≤8000) Hai dãy số gọi là tương thích nếu:

+ Nếu vị trí I có hai giá trị ai, bi bất kì j ≠ i mà ai=aj => bi=bj + Nếu vị trí I có hai giá trị ai, bi bất kì j ≠ i mà ai≠aj => bi≠bj Yêu cầu: hãy kiểm tra hai dãy {aN},{bN} có tương thích ko? Dữ liệu: vào từ file văn DAYSO.INP:

- Dòng đầu ghi số N

- Dòng thứ ghi N số nguyên dãy số {aN} - Dòng thứ ghi N số nguyên dãy số {bN} (các số mợt dịng ghi cách mợt dấu cách ) Kết quả: ghi file văn DAYSO.OUT:

Ghi số nếu tương thích,trong trường hợp ngược lại ghi số VD:

Dayso.inp Dayso.out Dayso.inp Dayso.out

4 3

1

1 1 3

0

Bài này đề khó hiểu tơi hiểu sau Cho dãy số An, và Bn Hai dãy số gọi là tương thích nếu:

Tại vị trí i bất kỳ mà với giá trị j<>i có (Ai=Aj Bi Bj) (Ai<>Aj Bi phải khác Bj)

- Bài này ta giả sử ban đầu g2 dãy tương thích Ta việc tìm vị trí mà

(Ai=Aj ) (Bi<>bj) (Ai<>Aj) (Bi=Bj)

Thì lúc d2 dãy khơng cịn tương thích kt:=true;

(6)

Chương trình hoàn chỉnh: Program DayTuongThich;

Var A,B:array[1 10000] of Integer; n:integer;

Procedure DocFile;

Program DaySoTuongThich; Var f:text;

i:integer; Begin

assign(f,'DaySo.INp'); Reset(f); readln(f,n);

For i:=1 to n read(f,A[i]); Readln(f);

for i:=1 to n read(f,B[i]); close(f);

End;

Procedure Xuly; var i,j:integer; f:text; kt:boolean; Begin

kt:=true;

for i:=1 to N for j:=1 to N

if i<>j then

if((A[i]=A[j]) And (B[i]<>B[j])) or ((A[i]<>A[j]) And (B[i]=B[j])) then

KT:=false;

assign(f,'DaySo.OUT'); rewrite(f); if kt then write(f,1)

else Write(f,0); close(f);

Ngày đăng: 05/03/2021, 14:10

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

Tài liệu liên quan