1. Trang chủ
  2. » Giáo án - Bài giảng

Download đề và đáp án thi học sinh giỏi lớp 12 môn tin học 2007 2008 tỉnh quảng bình (vòng 1+2)

11 439 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 11
Dung lượng 75,5 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Mỗi điểm được xỏc định bởi một cặp số x,y, trong đú x là hoành độ và y là tung độ của một điểm.. Dữ liệu vào: Cho trong file văn bản DISTANCE.INP cú cấu trỳc như sau: - Dũng 1: Ghi số ng

Trang 1

Sở Giáo dục và Đào tạo kỳ thi CHọN học sinh giỏi lớp 12 Quảng bình năm học 2007 - 2008

Đề chính thức Thời gian 180 phỳt, khụng kể thời gian giao đề

===========================================================

ĐỀ RA

Sử dụng ngụn ngữ lập trỡnh Turbo Pascal để giải cỏc bài toỏn sau:

Cõu 1: (3,0 điểm) Khoảng cỏch Manhattan DISTANCE.PAS

Trờn mặt phẳng tọa độ cho N điểm Mỗi điểm được xỏc định bởi một cặp số (x,y), trong đú x là hoành độ và y là tung độ của một điểm.

Người ta định nghĩa: Khoảng cỏch Manhattan giữa hai điểm A(xA,yA) và B(xB,yB) là giỏ trị được tớnh theo cụng thức: |xA-xB| + |yA-yB|.

Yờu cầu: Xỏc định khoảng cỏch Manhattan lớn nhất giữa 2 điểm trong N điểm.

Dữ liệu vào: Cho trong file văn bản DISTANCE.INP cú cấu trỳc như sau:

- Dũng 1: Ghi số nguyờn dương N, là số lượng điểm được cho trờn mặt phẳng.

- N dũng tiếp theo: Mỗi dũng ghi hai số nguyờn x y, là tọa độ của một điểm Hai số

được ghi cỏch nhau ớt nhất một dấu cỏch (1 < N < 1000; -10000 < x, y < 100000)

Dữ liệu ra: Ghi ra file văn bản DISTANCE.OUT theo cấu trỳc như sau:

- Dũng 1: Ghi một số nguyờn dương là khoảng cỏch Manhattan lớn nhất tỡm được.

Vớ dụ:

DISTANCE.INP DISTANCE.OUT 5

1 1

3 5

2 7

8 1

4 4

12

Cho một tập hợp T gồm N phần tử có giá trị nguyên dơng

Ngời ta định nghĩa: Số x thuộc tập hợp T đợc gọi là số chính nếu số x xuất hiện trong trong tập T nhiều hơn N/2 lần

Yêu cầu: Xác định trong tập hợp T có tồn tại số chính hay không.

Dữ liệu vào: Cho trong file văn bản NUMBER.INP có cấu trúc nh sau:

- Dòng 1: Ghi số nguyên dơng N, là số lợng phần tử của tập hợp T (1<N<600000)

- N dòng tiếp theo: Mỗi dòng ghi một số nguyên ai, là giá trị của một phần tử trong tập hợp T (0 < ai < 2147483647)

Dữ liệu ra: Ghi ra file văn bản NUMBER.OUT theo cấu trúc nh sau:

- Dòng 1: Ghi số -1 nếu không tồn tại số chính, ngợc lại ghi giá trị của số chính tìm

đợc.

Ví dụ:

7

Trang 2

3

2

2

4

2

3 2 2 4 2

Vơng quốc Cziama có N ngời dân, đợc đánh số từ 1 đến N Mỗi ngời dân đợc gán một tên là một xâu có không quá 30 ký tự thuộc tập [‘a’ ‘z’], trong đó chữ cái

đầu tiên của tên nhỏ hơn chữ cái cuối cùng của tên theo trật tự từ điển.

Trong ngày hội Carnames dân chúng tổ chức thành từng đội và lập một danh sách tên các ngời dân viết liên tục, liền nhau, không có dấu cách, sao cho chữ cái đầu tiên trong tên của ngời đứng sau phải trùng với chữ cái cuối cùng trong tên của ngời

đứng sát trớc Đội nào tạo ra đợc danh sách có số lợng ký tự lớn nhất sẽ đợc nhận th-ởng Nếu hai đội cùng có danh sách với độ dài nh nhau thì đội nào có ít thành viên hơn sẽ đợc nhận thởng Có thể có nhiều đội cùng đợc thởng

Yêu cầu: Hãy xác định một đội đợc nhận thởng.

Dữ liệu vào: Cho trong tệp văn bản CZIAMA.INP có cấu trúc nh sau:

- Dòng 1: Chứa số tự nhiên N là số dân trong Vơng quốc Cziama (0 < N  8000)

- N dòng tiếp theo: Mỗi dòng chứa tên của một ngời dân theo thứ tự từ 1 đến N.

Dữ liệu ra: Ghi ra tệp văn bản CZIAMA.OUT theo cấu trúc nh sau:

- Dòng 1: Ghi số nguyên dơng K, là số thành viên trong đội đợc nhận thởng.

- Dòng 2: Ghi số nguyên dơng L là độ dài của danh sách tên các thành viên trong đội

đợc nhận thởng.

- Dòng 3: Ghi K số nguyên dơng, là chỉ số của các thành viên trong đội theo trật tự

liên kết để tạo ra dãy tên dài nhất Các số đợc ghi cách nhau một dấu cách.

Ví dụ:

CZIAMA.INP CZIAMA.OUT 3

amai itacay ahomi

2

11

3 2

== Hết ==

Sở Giáo dục và Đào tạo kỳ thi CHọN học sinh giỏi lớp 12

Quảng bình năm học 2007 - 2008

môn: tin học-Vòng 2

Đáp án và hớng dẫn chấm

===========================================================

I/ Phơng pháp chung

- Giám khảo tạo các bộ dữ liệu vào, tính toán kết quả Thực hiện chơng trình của học sinh và so sánh kết quả.

- Giám khảo có thể sử dụng chơng trình gợi ý dới đây để tính kết quả của dữ liệu vào.

Trang 3

- Chơng trình học sinh chạy đúng mỗi bộ test, giám khảo cho 0.5 điểm Nh vậy, nếu câu hỏi có 3 điểm thì giám khảo phải tạo đợc 6 bộ test.

- Nếu chơng trình chạy sai test nào thì giám khảo cho 0 điểm đối với test đó

II/ Chơng trình gợi ý

Câu 1: (3,0 điểm) Distance.pas

const fi='distance.inp';

fo='distance.out';

type mmc=array[1 1000] of integer;

var x,y:mmc;

f:text;

n:integer;

max:word;

procedure doc;

var i:integer;

begin

assign(f,fi);reset(f);

readln(f,n);

for i:=1 to n do readln(f,x[i],y[i]);

close(f);

end;

procedure xl;

var i,j:integer;

kcij:word;

begin

max:=0;

for i:=1 to n-1 do

for j:=i+1 to n do

begin

kcij:=abs(x[i]-x[j])+abs(y[i]-y[j]);

if max<kcij then begin max:=kcij; end;

end;

end;

procedure xuat;

begin

assign(f,fo);rewrite(f);

writeln(f,max);

close(f);

end;

Begin

doc;

xl;

xuat;

End

Câu 2: (3,5 điểm) Number.pas

program sochinh;

const fi='Number.inp';

fo='number.out';

type bit=1 9;

ar1=array[1 10,0 9] of longint;

ar2=array[1 10] of byte;

var A:ar1;

B:ar2;

f,g:text;

n,i,j,time,n1,sl,so:longint;

{ -}

procedure init;

var x,k:integer;

i,m:longint;

s:char;

st,S1:string;

BEGIN

Fillchar(A,sizeof(A),0);

Assign(f,fi); reset(f);

readln(f,n);

For i:=1 to n do

Trang 4

begin

j:=10;

readln(f,st);

For i:=length(st) downto 1 do

begin

S1:=st[i];

val(s1,x,k);

inc(A[j,x]);

dec(j);

end;

end;

close(f);

end;

procedure process;

var i,j:integer;

max:longint;

BEGIN

max:=-1;

Fillchar(B,sizeof(B),0);

for i:=1 to 10 do

begin

max:=-1;

For j:=0 to 9 do

if max<A[i,j] then

begin

max:=A[i,j];

B[i]:=j;

end;

A[1,i-1]:=max;

end;

END;

{ -} function check:boolean;

var i:integer;

p:boolean;

BEGIN

p:=false;

check:=true;

For i:=0 to 9 do

if (A[1,i]<>0) or p then

begin

p:=true;

if A[1,i]=0 then

begin

check:=false;

exit;

end

else

if A[1,i]<=n/2 then

begin

check:=false; exit;

end;

end;

end;

procedure result;

var i,k:integer;

s,st:string;

p:boolean;

t:longint;

begin

st:='';

t:=1000000000;

p:=false;

For i:=1 to 10 do

begin

Trang 5

if (B[i]<>0) or p then

begin

so:=so+B[i]*t;

p:=true;

end;

t:=t div 10;

end;

END;

procedure main;

var i,sl,x:longint;

begin

sl:=0;

result;

Assign(f,fi); reset(f);

readln(f);

For i:=1 to n do

begin

readln(f,x);

if x=so then inc(sl);

end;

if sl>n/2 then

Writeln(g,so)

else

Writeln(g,-1);

close(f);

End;

Begin

time:=meml[0:$46c];

Assign(g,fo); rewrite(g);

init;

process;

if check then main

else Writeln(g,-1);

close(G);

Writeln(fi,' - ',(meml[0:$46c]-time)/18.2:4:4);

readln;

END

C©u 3: (3,5 ®iÓm) Cziama.pas

{$A+,B+,D+,E+,F-,G-,I+,L+,N-,O-,P-,Q+,R+,S+,T-,V+,X+}

{$M 65520,0,655360}

const fi='CZIAMA.IN1';

fo='CZIAMA.Out';

type cc= record

ts,cs:integer;

end;

mang=array['a' 'z','a' 'z']of cc;

mang2=array['a' 'z','a' 'z']of char;

mang3=array[1 8000]of integer;

var n:integer;

aa,a:mang;

tr:mang2;

procedure nhap;

var f:text;

i:integer;

st:string;

begin

assign(f,fi); reset(f);

readln(f,n);

for i:=1 to n do

begin

readln(f,st);

if length(st)>aa[st[1],st[length(st)]].ts then begin

aa[st[1],st[length(st)]].ts:= length(st); aa[st[1],st[length(st)]].cs:=i;

end;

Trang 6

end;

a:=aa;

end;

procedure xuli;

var i,j,k:char;

begin

for i:= 'a' to 'z'do

for j:= 'a' to 'z' do

if a[i,j].ts<>0 then

for k:= 'a' to 'z' do

if a[j,k].ts<>0 then

if a[j,k].ts<aa[j,k].ts+a[i,j].ts then

begin

a[j,k].ts:=aa[j,k].ts+a[i,j].ts;

tr[j,k]:=i;

end;

end;

procedure xuat;

var i,j,vt1,vt2:char;

max,ii,jj:longint;

b:mang3; f:text;

tam:char;

begin

max:=0;

for i:='a' to 'z' do for j:='a' to 'z' do if a[i,j].ts>max then begin max:=a[i,j].ts; vt1:=i; vt2:=j; end;

b[1]:=aa[vt1,vt2].cs; ii:=1;

while aa[vt1,vt2].cs<>0 do

begin

b[ii]:=aa[vt1,vt2].cs;

tam:=vt2;

vt2:=vt1;

vt1:=tr[vt1,tam];

if (vt1=#0) or (vt2=#0) then break;

ii:=ii+1;

end;

assign(f,fo); rewrite(f);

writeln(f,ii);

writeln(f,max);

for jj:=ii downto 1 do write(f,b[jj],' ');

close(f);

end;

BEGIN

nhap; xuli; xuat;

END

Së Gi¸o dôc vµ §µo t¹o kú thi CHäN häc sinh giái líp 12 Qu¶ng b×nh n¨m häc 2007 - 2008

§Ò chÝnh thøc Thời gian 180 phút, không kể thời gian giao đề

===========================================================

ĐỀ RA

Sử dụng ngôn ngữ lập trình Turbo Pascal để giải các bài toán sau:

Câu 1: (3,0 điểm) Dãy số chia hết M CHIAHET.PAS

Cho N và M là hai số nguyên dương.

Yêu cầu: Hãy tìm tất cả các số nguyên dương có N chữ số và chia hết cho M.

Dữ liệu vào: Cho trong file văn bản CHIAHET.INP có cấu trúc như sau:

- Dòng 1: Ghi hai số nguyên dương N M Hai số được ghi cách nhau một dấu cách.

Trang 7

(1 <= N  7; 1 < M  9999999)

Dữ liệu ra: Ghi ra file văn bản CHIAHET.OUT theo cấu trỳc như sau:

- Dũng 1: Ghi số nguyờn dương K là số lượng phần tử tỡm được.

- K dũng tiếp theo: Mỗi dũng ghi giỏ trị của một phần tử tỡm được.

Vớ dụ:

CHIAHET.INP CHIAHET.OUT

10 20 30 40 50 60 70 80 90

Cõu 2: (3,5 điểm) Đếm số lượng hỡnh tam giỏc TAMGIAC.PAS

Trong mặt phẳng tọa độ cho N điểm Mỗi điểm được xỏc định bởi một cặp số (x, y), trong đú x là hoành độ và y là tung độ của một điểm.

Yờu cầu: Đếm tất cả cỏc hỡnh tam giỏc được tạo ra từ N điểm cho trước.

Dữ liệu vào: Cho trong file văn bản TAMGIAC.INP cú cấu trỳc như sau:

- Dũng 1: Ghi số nguyờn dương N, là số lượng điểm được cho trờn mặt phẳng tọa

độ.

- N dũng tiếp theo: Mỗi dũng ghi hai số nguyờn x y là tọa độ của một điểm, hai số

được ghi cỏch nhau ớt nhất một dấu cỏch (2 < N < 100; -32767 < x, y < 32767)

Dữ liệu ra: Ghi ra file văn bản TAMGIAC.OUT theo cấu trỳc như sau:

- Dũng 1: Ghi số lượng hỡnh tam giỏc tỡm được.

Vớ dụ:

4

1 1

1 0

2 0

2 2

4

Các kỹ s Tin học đang chế tạo một loại đĩa từ có dung lợng rất lớn Đĩa có N

đờng ghi Các đờng ghi là những hình tròn đồng tâm tại tâm của đĩa Khoảng cách giữa hai đờng ghi liên tiếp là rất nhỏ Các đờng ghi đợc đánh số từ 0 đến N, từ ngoài vào trong Đối với loại đĩa này, việc dịch chuyển đầu đọc từ một đờng ghi sang một

đờng ghi kế tiếp là rất khó Vì vậy, ngời ta thiết kế mạch điều khiển với 2 loại lệnh: Lệnh tiến (T) và lệnh lùi (L).

Trang 8

Lệnh T: đa đầu đọc tiến lên phía trớc P đờng ghi (P>0) Ví dụ, đầu đọc đang ở

đờng ghi K, sau khi thực hiện lệnh T thì nó chuyển tới đờng ghi K+P Lệnh T không

áp dụng đợc khi K+P>N.

Lệnh L: đa đầu đọc lùi Q đờng ghi (Q>0) Ví dụ, đầu đọc đang ở đờng ghi K, sau khi thực hiện lệnh L thì nó chuyển tới đờng ghi K-Q Lệnh L không áp dụng đợc khi K-Q<0.

Để di chuyển đầu đọc từ đờng ghi U đến đờng ghi V có thể phải áp dụng một dãy các lệnh T L Một dãy M lệnh T (hoặc L) liên tiếp đợc viết gọn là Tm (hoặc Lm), trong đó M là số nguyên dơng, 1  M.

Yêu cầu: Với N P Q cho trớc (0 < N  20000; 0 < Q, P < N) Hãy chỉ ra ít nhất các lệnh L T để đa đầu đọc từ đờng ghi U đến đờng ghi V (0  U, V  N) hoặc cho biết không tồn tại dãy các lệnh nh vậy.

Dữ liệu vào: Cho trong file văn bản DOCDIA.INP, có cấu trúc nh sau:

- Dòng 1: Ghi 5 số nguyên dơng N P Q U V Các số đợc ghi cách nhau ít nhất một

dấu cách.

Dữ liệu ra: Ghi ra file văn bản DOCDIA.OUT, theo cấu trúc nh sau:

- Dòng 1: Nếu không tồn tại cách đa đầu đọc về đờng ghi V thì ghi số -1 Ngợc lại,

ghi số nguyên K là số lợng lệnh cần thực hiện, và dòng 2.

- Dòng 2: Ghi dãy các lệnh cần thực hiện, có dạng TmLnTpLq

Ví dụ:

10 5 3 7 6 3

L2T1

10 9 8 5 6 -1

=== Hết ===

Sở Giáo dục và Đào tạo kỳ thi CHọN học sinh giỏi lớp 12

Quảng bình năm học 2007 - 2008

môn: tin học-Vòng 1

Đáp án và hớng dẫn chấm

===========================================================

I/ Phơng pháp chung

- Giám khảo tạo các bộ dữ liệu vào, tính toán kết quả Thực hiện chơng trình của học sinh và so sánh kết quả.

- Giám khảo có thể sử dụng chơng trình gợi ý dới đây để tính kết quả của dữ liệu vào.

- Chơng trình học sinh chạy đúng mỗi bộ test, giám khảo cho 0.5 điểm Nh vậy, nếu câu hỏi có 3 điểm thì giám khảo phải tạo đợc 6 bộ test.

- Nếu chơng trình chạy sai test nào thì giám khảo cho 0 điểm đối với test đó

II/ Chơng trình gợi ý

Cõu 1: (3,0 điểm) Chiahet.pas

const fi='chiahet.inp';

fo='chiahet.out';

var f:text;

n:byte;

m:longint;

csd,csc:longint;

procedure doc;

begin

Assign(f,fi);reset(f);

Trang 9

readln(f,n, m);

close(f);

end;

procedure xl;

var dem,i:longint;

begin

case n of

1:begin csd:=1;csc:=9;end;

2:begin csd:=10;csc:=99;end;

3:begin csd:=100;csc:=999;end;

4:begin csd:=1000;csc:=9999;end;

5:begin csd:=10000;csc:=99999;end;

6:begin csd:=100000;csc:=999999;end;

7:begin csd:=1000000;csc:=9999999;end;

end;

assign(f,fo);rewrite(f);

dem:=0;

for i:=csd to csc do

if i mod m =0 then dem:=dem+1;

writeln(f,dem);

for i:=csd to csc do

if i mod m =0 then writeln(f,i);

close(f);

end;

Begin

doc; xl;

End

Câu 2: (3,5 điểm) Tamgiac.pas

const fi='tamgiac.inp';

fo='tamgiac.out';

type

integer=longint;

diem=record

x:integer;

y:integer;

end;

mmc=array[1 100] of diem;

var a:mmc;

n,i,j,k:byte;

f:text;

dem:longint;

function tg(a,b,c:diem):boolean;

var x1,x2,y1,y2: integer;

begin

x1:=b.x-a.x;

y1:=b.y-a.y;

x2:=c.x-a.x;

y2:=c.y-a.y;

if x1*y2=x2*y1 then tg:=false

else tg:=true;

end;

Begin

assign(f,fi);reset(f);

readln(f,n);

for i:=1 to n do readln(f,a[i].x,a[i].y);

close(f);

dem:=0;

for i:=1 to n-2 do

for j:=i+1 to n-1 do

for k:=j+1 to n do

if tg(a[i],a[j],a[k]) then dem:=dem+1; assign(f,fo); rewrite(f);

Writeln(f,dem);

close(f);

END

Trang 10

Câu 3: (3,5 điểm) Docdia.pas

const fi='Docdia.inp';

fo='Docdia.out';

type mmc=ARRAY[0 32766] of 0 20000;

mdd=ARRAY[0 20000] of boolean;

mmc1=ARRAY[0 65534] of char;

var f:text; a:^mmc; tum:^mmc; cc:mdd; co:^mdd; b:^mmc1; p,q,u,v,n,z1,i:longint;

procedure nhap;

Begin

assign(f,fi); reset(f);

readln(f,n,p,q,u,v);

close(f);

end;

procedure init;

var j:longint;

Begin

for j:=0 to n do co^[j]:=false;

end;

procedure xuli;

var sl:longint;

Begin

z1:=u;

a^[1]:=u;

co^[z1]:=true;

sl:=1;

while (z1<>v) and (sl>=1) do

Begin

if (z1+p<=n) and not co^[z1+p] then

Begin

inc(sl);

a^[sl]:=z1+p;

cc[z1+p]:=true;

tum^[z1+p]:=z1;

co^[z1+p]:=true;

end;

if (z1-q>=0) and not co^[z1-q] then

Begin

inc(sl);

a^[sl]:=z1-q;

cc[z1-q]:=false;

tum^[z1-q]:=z1;

co^[z1-q]:=true;

end;

dec(sl);

for i:=1 to sl do

a^[i]:=a^[i+1];

z1:=a^[1];

end;

end;

procedure xuat;

var s,k,u1:longint;

Begin

assign(f,fo); rewrite(f);

u1:=z1;

if z1=v then

Begin

i:=0;

while u1<>u do

Begin

inc(i);

if cc[u1] then b^[i]:='T'

else b^[i]:='L';

u1:=tum^[u1];

end;

writeln(f,i);

Ngày đăng: 11/10/2015, 13:33

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w