Tổng quan bài thi: trình File dữ liệu vào File kết quả Bài 3 Dãy ngoặc đúng phân biệt BAI3.PAS BAI3.INP BAI3.OUT Bài 4 Dãy con có tổng lớn nhất BAI4.PAS BAI4.PAS BAI4.PAS Dữ liệu vào l
Trang 1SỞ GD VÀ ĐT THANH HOÁ
TRƯỜNG THPT HOẰNG HÓA 2
THI KHẢO SÁT CHẤT LƯỢNG HỌC SINH GIỎI
Năm học: 2020-2021 Môn thi: Tin học
Ngày thi: ………….
Thời gian: 180 phút (không kể thời gian giao đề)
Đề này có 05 bài, gồm 03 trang.
Tổng quan bài thi:
trình File dữ liệu vào File kết quả
Bài 3 Dãy ngoặc đúng phân biệt BAI3.PAS BAI3.INP BAI3.OUT
Bài 4 Dãy con có tổng lớn nhất BAI4.PAS BAI4.PAS BAI4.PAS
Dữ liệu vào là đúng đắn, không cần phải kiểm tra.
Hãy lập trình giải các bài toán sau:
Bài 1: (5 điểm) Trông xe
Một bãi đỗ xe nhận trông xe trong vòng một tháng Mỗi xe sẽ được gắn một số hiệu là một số nguyên dương T (10102010 ≤ T ≤ 10109999) Hai xe khác nhau sẽ được gắn hai số hiệu khác nhau Một xe có thể ra vào bãi đỗ xe nhiều lần, mỗi lần vào bãi đỗ
xe, người trông xe sẽ ghi vào sổ sách số hiệu của chiếc xe đó Cuối tháng dựa vào sổ ghi chép, người trông xe làm thống kê về số lần vào bãi đỗ xe của từng chiếc xe để tiến hành thu phí Nếu một chiếc xe vào bãi đỗ xe P lần, cuối tháng chủ xe phải trả một lượng phí C được tính như sau:
5
5 )
5 ( 100
100
>
≤
− +
=
p
p nêu
nêu p
C
Yêu cầu: Tính tổng số phí người trông xe thu được vào cuối tháng
Dữ liệu vào: File văn bản BAI1.INP gồm:
- Dòng đầu chứa một số nguyên dương K (0 < K ≤ 10)
- K dòng tiếp theo, mỗi dòng chứa số hiệu một chiếc xe.
Dữ liệu ra: File văn bản BAI1.OUT có 1 số nguyên, là tổng phí thu được.
Ví dụ:
Trang 27 10102010 10108888 10102010 10102010 10102010 10102010 10102010
210
Bài 2: (5 điểm) Số lớn nhất
Với số nguyên dương N cho trước ở hệ thập phân người ta có thể tạo ra những số nguyên khác nhau bằng cách hoán vị các chữ số của N Ví dụ, với N=133, ta có thể có các số 313 và 331
Yêu cầu: Hãy xác định số lớn nhất trong những số được tạo ra từ cách hoán vị các chữ
số của N
Dữ liệu vào: File văn bản BAI2.INP gồm 1 dòng chứa số nguyên N (số nguyên N
không vượt quá 106 chữ số).
Dữ liệu ra: File văn bản BAI2.OUT có 1 số nguyên, là số lớn nhất trong những số được
tạo ra từ cách hoán vị các chữ số của N.
Ví dụ:
BAI2.INP BAI2.OUT
Bài 3: (4 điểm) Dãy ngoặc đúng phân biệt
Người ta định nghĩa một xâu kí tự gồm các kí tự ‘(’ và ‘)’ là một dãy ngoặc đúng như sau:
- Xâu rỗng là một dãy ngoặc đúng.
- Nếu A là dãy ngoặc đúng thì (X) cũng là một dãy ngoặc đúng
- Nếu A, B là những dãy ngoặc đúng thì AB cũng là dãy ngoặc đúng.
Những dãy ngoặc sau là những dãy ngoặc đúng:
- ()(())
- ((()))
Những dãy ngoặc sau thì không:
Trang 3- )(
- (((()))
- )()()(
Cho một xâu kí tự T chỉ gồm kí tự ‘(’ và ‘)’ Như vậy xâu con liên tiếp các kí tự của
T có thể là một dãy ngoặc đúng hoặc không đúng
Yêu cầu: Hãy đếm số lượng xâu con phân biệt của T là một dãy ngoặc đúng.
Dữ liệu vào: File văn bản BAI3.INP gồm:
- Dòng thứ nhất chứa số nguyên dương n là số lượng xâu con (n ≤ 20).
- N dòng tiếp theo, mỗi dòng chứa một xâu T (độ dài xâu T không quá 103 kí tự)
Dữ liệu ra: Ghi ra file văn bản BAI3.OUT gồm n dòng, mỗi dòng là số xâu con phân
biệt của T là ngoặc đúng.
Ví dụ:
3 (()())() (()()()()() ()()()(()())(()())
4 5 11
Bài 4: (3 điểm) Dãy con có tổng lớn nhất
Cho dãy số a1…aN Tìm dãy con gồm một phần tử hoặc một số phần tử liên tiếp của dãy đã cho có tổng các phần tử của dãy là lớn nhất
Dữ liệu vào: từ tệp BAI4.INP gồm:
Dòng đầu tiên chứa số nguyên dương N (n≤106)
Dòng thứ 2 chứa dãy số a1 aN Các phần tử trong dãy nhỏ hơn 106
Dữ liệu ra: ghi vào tệp BAI4.OUT
Dòng đầu tiên ghi tổng các phần tử của dãy con thỏa mãn.
Dòng thứ 2 ghi số lượng dãy con thỏa mãn.
Trang 4Ví dụ:
9
8 12 -14 1 23 -6 22 -34 13
46 1
Bài 5: (3 điểm) Miền mặt phẳng
Trên mặt phẳng cho trước n đường thẳng Các đường thẳng trong mặt phẳng được cho bởi 3 số thực A, B, C với phương trình Ax+By=C (với A, B, C không đồng thời bằng 0).
Yêu cầu: Hãy tính số miền mặt phẳng được chia bởi các đường thẳng này.
Dữ liệu vào: Từ tệp văn bản BAI5.INP:
- Dòng đầu tiên ghi số nguyên dương N (N<100).
- N dòng tiếp theo, mỗi dòng ghi 3 số nguyên A, B, C.
Dữ liệu ra: Ghi ra file BAI5.OUT gồm một dòng duy nhất là kết quả bài toán.
Ví dụ:
BAI5.INP BAI5.OUT BAI5.INP BAI5.OUT
1
1 -1 0
1 0 3
1 0 1
1 -1 0
6
Cán bộ coi thi không giải thích gì thêm.
Trang 5
-Hết -ĐÁP ÁN Bài 1:
const fi='bai1.inp'; fo='bai1.out';
Var
dem:array[10102010 10109999] of longint;
i,n,s:longint;
procedure nhap;
var i:integer; x: longint;
begin
assign(input,fi);reset(input);
fillchar(dem,sizeof(dem),0);
readln(n);
for i:=1 to n do begin read(x); dem[x]:=dem[x]+1;end;
close(input);
end;
begin
nhap;
assign(output,fo);rewrite(output);
s:=0;
for i:=10102010 to 10109999 do
if dem[i]>0 then
if dem[i]<=5 then s:=s+100
else s:=s+100+(dem[i]-5);
write(s);
close(output);
end
Bài 2:
const fi='bai2.inp'; fo='bai2.out';
var st:ansistring;
i:longint;
procedure sx(l,r:longint);
var i,j:longint;
x,tg:char;
begin
x:=st[(l+r)div 2];
i:=l;
j:=r;
while i<=j do
begin
while st[i]>x do inc(i);
while st[j]<x do dec(j);
if i<=j then
begin
tg:=st[i]; st[i]:=st[j]; st[j]:=tg;
end;
inc(i); dec(j);
end;
if i<r then sx(i,r);
if j>l then sx(l,j);
end;
BEGIN
assign(input,fi); reset(input);
assign(output,fo); rewrite(output);
Trang 6readln(st);
sx(1,length(st));
for i:=1 to length(st) do write(st[i]);
close(input); close(output);
END
Bài 3:
const fi='bai3.inp'; fo='bai3.out';
var s1,s2,s:ansistring;
d,t,i,j,k,n:longint;
begin
assign(input,fi);reset(input);
assign(output,fo);rewrite(output);
readln(n);
for k:=1 to n do
begin
readln(s);s1:=s; t:=0;
for i:=1 to length(s) do
begin
d:=0;delete(s1,1,1);
for j:=i to length(s) do
begin
if s[j]='(' then inc(d)
else dec(d);
if d=0 then
begin
s2:=copy(s,i,j-i+1);
if pos(s2,s1)=0 then inc(t);
end;
if d<0 then break;
end;
end;
writeln(t);
end;
close(input);close(output);
end
Bài 4:
const fi='bai4.inp'; fo='bai4.out';
var i,n,max,d:longint;
a,f:array[0 10000000] of longint;
begin
assign(input,fi); reset(input);
assign(output,fo); rewrite(output);
readln(n);
for i:=1 to n do read(a[i]);
f[1]:=a[1]; d:=1; max:=a[1];
for i:=2 to n do
begin
if f[i-1]+a[i]>a[i] then f[i]:=f[i-1]+a[i]
else f[i]:=a[i];
if f[i]>max then
begin
max:=f[i];
d:=0;
Trang 7end;
if f[i]=max then inc(d);
end;
writeln(max); writeln(d);
close(input); close(output);
end
Bài 5:
const fi='bai5.inp'; fo='bai5.out';
var l,i,h,j,k1,k2,n,sgd,mmp:longint;
e,f,a,b,c:array[1 200] of real;
d,a1,b1,c1,x,y:real;
procedure kq(m1,p1,q1,m2,p2,q2:real;var x,y:real) ;
var dx,dy:real;
begin
dx:=q1*p2-q2*p1; dy:=m1*q2-m2*q1; x:=dx/d; y:=dy/d;
end;
begin
assign(input,fi); reset(input);
assign(output,fo); rewrite(output);
readln(n);h:=0;
for i:=1 to n do
begin
h:=h+1;
readln(a1,b1,c1);
end;
mmp:=2;
for i:=2 to n do
begin
l:=0;
for j:=i-1 downto 1 do
begin
d:=a[i]*b[j]-a[j]*b[i];
if d=0 then sgd:=0 else
begin kq(a[i],b[i],c[i],a[j],b[j],c[j],x,y);
l:=l+1;
e[l]:=x;f[l]:=y;
end;
end;
begin sgd:=l;
for k1:=2 to l do
for k2:=k1-1 downto 1 do if(e[k1]=e[k2]) and (f[k1]=f[k2]) then
begin sgd:=sgd-1;break;
end;
end;
mmp:=mmp+sgd+1;
end;
writeln(mmp);
close(input);close(output);
end