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 1Sở 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 23
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 4begin
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 5if (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 6end;
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 8Lệ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 9readln(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 10Câ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);