Hãy tìm cách xếp các bức tranh chồng lên nhau thỏa mãn đồng thời các điều kiện sau: -Bức tranh ở trên phải luôn nằm trong bức tranh ở dới mọi điểm của bức tranh ở trên không đợc chìa ra
Trang 1Câu 1: (3 điểm) DAYSO.PAS
Cho một số nguyên dơng N (N<=10000) Hãy tìm dãy số thỏa mãn các tính chất sau:
-Phần tử đầu tiên của dãy là số N.
-Các phần tử của dãy là các số nguyên dơng và phải giảm dần.
-Với mỗi số ai (i>1) thuộc dãy thì ai hoặc là số nguyên tố hoặc là ớc của một trong các số từ a1 đến ai-1
-Số lợng phần tử của dãy tìm đợc phải lớn nhất.
Dữ liệu vào: Cho trong file văn bản DAYSO.INP có cấu trúc nh
sau:
Dòng 1: Ghi số N.
Dữ liệu ra: Ghi ra file DAYSO.OUT theo cấu trúc nh sau:
Dòng 1: Ghi số K là số lợng phần tử của dãy tìm đợc.
Dòng 2: Ghi K số nguyên dơng là các phần tử của dãy tìm đợc Các số ghi cách nhau ít nhất một dấu cách.
Ví dụ:
6 5 3 2 1
Trong một biểu thức gồm có các biến, phép toán nhân và lũy thừa, số mũ.
Trong đó: Biến là một chữ cái la tinh in thờng ‘a’ ‘z’, phép nhân
đợc ký hiệu là dấu sao ‘*’, phép lũy thừa đợc ký hiệu là dấu mũ
‘^’, số mũ là một chữ số trong các chữ số từ 1 9.
Hãy rút gọn biểu thức có dạng nh đã cho để đợc biểu thức mới thỏa mãn đồng thời các điều kiện sau:
-Các biến xuất hiện trong biểu thức không quá 1 lần.
-Các biến phải đợc đa ra theo thứ tự từ điển.
Dữ liệu vào: Cho trong file văn bản BIEUTHUC.INP có cấu trúc
nh sau:
Dòng 1: Ghi xâu ký tự S là biểu thức cần rút gọn (số lợng ký tự của S bé hơn 256)
Dữ liệu ra: Ghi ra file BIEUTHUC.OUT theo cấu trúc nh sau:
Dòng 1: Ghi xâu X là xâu ký tự sau khi đã rút gọn.
Chú ý: Sau khi rút gọn, giá trị của số mũ m của các biến có thể nằm trong đoạn [1 1000].
Ví dụ:
Trang 2BIEUTHUC.INP BIEUTHUC.OUT
a*a^9*x*x*x*b*b^3 a^10*b^4*x^3
Tranh vẽ là một hình chữ nhật Cho N bức tranh, bức tranh thứ i đợc cho bởi độ dài hai cạnh là ai và bi Hãy tìm cách xếp các bức tranh chồng lên nhau thỏa mãn đồng thời các điều kiện sau:
-Bức tranh ở trên phải luôn nằm trong bức tranh ở dới (mọi
điểm của bức tranh ở trên không đợc chìa ra ngoài so với bức tranh ở dới).
-Các cạnh của bức tranh trên phải đợc đặt song song với các cạnh của bức tranh ở dới nó.
-Số lợng các bức tranh đợc xếp là lớn nhất.
Dữ liệu vào: Cho trong file văn bản XEPTRANH.INP có cấu trúc
nh sau:
Dòng 1: Ghi số N là số lợng các bức tranh đã cho (N nguyên dơng, n<=100)
N dòng tiếp theo: mỗi dòng ghi hai số ai bi (0< xi , yi <30000)
là độ dài hai cạnh của bức tranh Hai số ghi cách nhau ít nhất một dấu cách.
Dữ liệu ra: Ghi ra file văn bản XEPTRANH.OUT theo cấu trúc sau:
Dòng 1: Ghi số K là số lợng bức tranh tìm đợc.
Dòng 2: Ghi K số nguyên dơng là chỉ số của các bức tranh đợc chọn Các số đợc ghi theo thứ tự từ dới lên trên của chồng tranh
đ-ợc xếp Các số ghi cách nhau ít nhất 1 dấu cách.
Ví dụ:
XEPTRANH.INP XEPTRANH.OUT
6 5
2 4
3 5
Trang 3hớ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ả Chạy
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 mẫu để tính kết quả của dữ liệu vào: DAYSO.PAS BIEUTHUC.PAS XEPTRANH.PAS
- 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 đó
- Bài toán có thể có nhiều kết quả đúng, nếu kết quả của học sinh khác với đáp án nhng vẫn đúng thì giám khảo vẫn cho
điểm tối đa.
- Giám khảo có thể sử dụng các test gợi ý dới đây nếu cần thiết.
II/ Ch ơng trình mẫu
DAYSO.PAS
const fi='dayso.in3'; fo='dayso.ou3';
type mmc=array[1 10000] of word;
var f:text; n,dem:word; a:mmc;
procedure doc;
begin
assign(f,fi);reset(f); readln(f,n); close(f);
end;
function nt(i:word):boolean;
var j:word;
begin
nt:=true;
for j:=2 to trunc(sqrt(i)) do
if i mod j = 0 then
begin nt:=false; break; end;
end;
procedure xl;
var i,j:word;
Trang 4dem:=1; a[dem]:=n;
for i:=n-1 downto 1 do
begin
if nt(i) then
begin dem:=dem+1; a[dem]:=i; end
else
begin
for j:=1 to dem do
if a[j] mod i=0 then
begin dem:=dem+1;a[dem]:=i;break; end;
end;
end;
end;
procedure xuat;
var i:word;
begin
assign(f,fo);rewrite(f); writeln(f,dem);
for i:=1 to dem do write(f,a[i],' ');
close(f);
end;
begin doc; xl; xuat; end
BIEUTHUC.PAS
const fi='bieuthuc.in1'; fo='bieuthuc.ou1';
type mmc=array['a' 'z'] of word;
var f:text; s:string; a:mmc;
procedure doc;
begin assign(f,fi);reset(f); readln(f,s); close(f); end;
procedure xl;
var so,ml:integer;
begin
assign(f,fo);rewrite(f);
while s<>'' do
begin
if length(s)=1 then begin [s[1]]:=a[s[1]]+1;delete(s,1,1);
end
else
begin
if s[2]='*' then
begin a[s[1]]:=a[s[1]]+1; delete(s,1,2); end;
if s[2]='^' then
begin
val(s[3],so,ml); a[s[1]]:=a[s[1]]+so; delete(s,1,4);
end;
end;
end;
close(f);
end;
procedure xuat;
var c:char; s1,s2:string;
begin
Trang 5assign(f,fo); rewrite(f); s1:='';
for c:='a' to 'z' do
begin
if a[c]>0 then
if a[c]>1 then begin str(a[c],s2);s1:=s1+c+'^'+s2+'*'; end
else s1:=s1+c+'*';
end;
delete(s1,length(s1),1); writeln(f,s1);
close(f);
end;
begin doc; xl; xuat; end
XEPTRANH.PAS
const fi='xeptranh.inp'; fo='xeptranh.out';
type mmc=array[0 100] of longint;
var f:text; n:word; a,b,qh,tr,cs:mmc;
procedure doc;
var i:word;t:longint;
begin
assign(f,fi);reset(f); readln(f,n); a[0]:=0;b[0]:=0;
for i:=1 to n do
begin
readln(f,a[i],b[i]);
if a[i]> b[i] then
begin t:=a[i];a[i]:=b[i];b[i]:=t; end;
end;
close(f);
for i:=1 to n do cs[i]:=i;
end;
procedure sx;
var i,j:word; t:longint;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]*b[i]>a[j]*b[j] then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
t:=b[i];b[i]:=b[j];b[j]:=t;
t:=cs[i];cs[i]:=cs[j];cs[j]:=t;
end;
end;
procedure xl;
var i,j:word;
begin
sx; fillchar(qh,sizeof(qh),0);
for i:=1 to n do
for j:=0 to i-1 do
if (a[i]>=a[j]) and (b[i]>=b[j]) then
if qh[i]<qh[j]+1 then
begin qh[i]:=qh[j]+1;tr[i]:=j;end;
end;
procedure xuat;
Trang 6var i,max,vt:word;
begin
assign(f,fo);rewrite(f); max:=qh[1]; vt:=1;
for i:=1 to n do
if max<qh[i] then begin max:=qh[i]; vt:=i;end;
i:=vt; writeln(f,max);
while qh[i]<>0 do
begin write(f,cs[i],' '); i:=tr[i]; end;
close(f);
end;
begin doc; xl; xuat; end
III/ Mét sè test gîi ý.
DAYSO.PAS
1
10 7 5 3 2 1
20 19 17 13 11 10 7 5 4 3 2 1
BIEUTHUC.PAS
BIEUTHUC.IN x^7*l^3*i^8*s^6*j^6*q*y^9*r^2*v*s^6*e^7*
m^7*z^2*o^6 BIEUTHUC.O
U e^7*i^8*j^6*l^3*m^7*o^6*q*r^2*s^12*v*x^ 7*y^9*z^2 BIEUTHUC.IN a^8*v*j^3*t^5*p*a^9*i^7*q^3*u^7*x^5*b*z^6*j
^9*s*b^8*u^7
BIEUTHUC.O
U a^17*b^9*i^7*j^12*p*q^3*s*t^5*u^14*v*x^ 5*z^6 BIEUTHUC.IN x*x*x*x*x*x*a*x
BIEUTHUC.O
XEPTRANH.PAS
10
21 1
4 7
6 5
2 4
3 5
6 8
7 6
10 20
12 19
13 17
6
8 6 7 2 5 4
5
4 6
7 4
4
2 4 3 5
Trang 73 5
7 3
2 1
1
6
1 20
2 19
3 18
4 17
5 16
6 15
1
1
Giám khảo lu ý khi sử dụng các test để chấm bài:
+ Tổng số lợng bức tranh của học sinh bắt buộc phải giống
đáp án.
+ Chỉ số của bức tranh có thể có nhiều cách khác nhau.
Cho dãy số có N phần tử (1<=N<=400000) Trong đó các phần từ ai của dãy đều đôi một khác nhau (tức không có phần tử trùng nhau, 0<=ai<=400000) Hãy tìm các sắp xếp dãy số theo trật tự tăng dần.
Dữ liệu vào: Cho trong file văn bản SAPDAY.INP có cấu trúc nh
sau:
Dòng 1: Ghi số N là số lợng các phần tử của dãy đã cho (N nguyên dơng)
Dòng 2: Ghi N số nguyên không âm ai Các số ghi cách nhau ít nhất một dấu cách.
Dữ liệu ra: Ghi ra file văn bản SAPDAY.OUT theo cấu trúc sau:
Dòng 1: Ghi N số nguyên không âm là các phần tử của dãy sau khi đã sắp theo trật tự tăng dần.
Ví dụ:
Trang 8SAPDAY.INP SAPDAY.OUT
4 6 400000 3
Một nhóm gồm N học sinh tham gia một câu lạc bộ Biết thời gian mà học sinh i có mặt tại câu lạc bộ là [ai ,bi] (ai < bi) Cô giáo chủ nhiệm câu lạc bộ muốn đến thăm các học sinh trong nhóm Hãy giúp cô giáo xác định thời điểm đến câu lạc bộ để gặp đợc nhiều học sinh trong nhóm nhất.
Dữ liệu vào: Cho trong file văn bản GAPMAT.INP có cấu trúc nh
sau:
Dòng 1: Ghi số N (N nguyên dơng, N<=1000)
N dòng: mỗi dòng ghi 2 số nguyên không âm ai bi (0<= ai , bi
<=32766) Các số ghi cách nhau ít nhất một dấu cách.
Dữ liệu ra: Ghi ra file văn bản GAPMAT.OUT theo cấu trúc:
Dòng 1: Ghi số nguyên dơng k là số lợng học sinh có mặt tại câu lạc bộ khi cô giáo đến.
Dòng 2: Ghi chỉ số của k học sinh có mặt tại câu lạc bộ khi cô
đến Các số ghi cách nhau ít nhất một dấu cách, theo thứ tự tăng dần.
Ví dụ:
GAPMAT.INP GAPMAT.OUT GAPMAT.INP GAPMAT.OUT
9 11
Cho N hình chữ nhật (1<=N<=100), mỗi hình đợc cho bởi hai số nguyên dơng là độ dài hai cạnh Quan hệ “bao hàm” đợc
định nghĩa nh sau: Hình chữ nhật A đợc gọi là có quan hệ bao hàm với hình B nếu nh đặt trọn hình A vào trong hình B hoặc đặt trọn hình B trong hình A (Các cạnh của hình A phải
Trang 9song song với các cạnh tơng ứng của hình B, cho phép có thể chung nhau các điểm biên)
Hãy tìm tập con trong tập N hình chữ nhật đã cho sao cho thỏa mãn đồng thời các điều kiện sau:
-Có số lợng hình là nhiều nhất.
-Hai hình bất kỳ trong tập con không thể có quan hệ bao hàm nhau.
Dữ liệu vào: Cho trong file văn bản HCN.INP có cấu trúc nh sau:
Dòng 1: Ghi số N (N nguyên)
N dòng tiếp theo: mỗi dòng ghi hai số xi yi (0< xi , yi <=30000)
là độ dài hai cạnh của hình chữ nhật Hai số ghi cách nhau ít nhất một dấu cách.
Dữ liệu ra: Ghi ra file văn bản HCN.OUT theo cấu trúc sau:
Dòng 1: Ghi số K là số lợng hình chữ nhật tìm đợc.
K dòng tiếp theo: Mỗi dòng ghi hai số nguyên xi yi là độ dài hai cạnh của các hình chữ nhật tìm đợc Hai số ghi cách nhau ít nhất một dấu cách.
Ví dụ:
2 4
3 5
hớng dẫn chấm
Trang 10I/ 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ả Chạy
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 mẫu để tính kết quả của dữ liệu vào: SAPDAY.PAS GAPMAT.PAS HCN.PAS
- 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 đó
- Bài toán có thể có nhiều kết quả đúng, nếu kết quả của học sinh khác với đáp án nhng vẫn đúng thì giám khảo vẫn cho
điểm tối đa.
- Giám khảo có thể sử dụng các test gợi ý dới đây nếu cần thiết.
II/ Ch ơng trình mẫu
SAPDAY.PAS
const fi='sapday.in1';
fo='sapday.ou1';
maxn=10000;
type mmc=array[0 50000] of byte;
var a:mmc; n:longint; f:text;
procedure xl;
var i,x:longint;b,bi:word;
begin
fillchar(a,sizeof(a),0);
assign(f,fi);reset(f);
readln(f,n);
for i:=1 to n do
begin
read(f,x);b:=x shr 3;bi:=x and 7; a[b]:=a[b] or (1 shl bi);
end;
close(f);
end;
procedure xuat;
var f:text; i:longint;j:byte;
begin
assign(f,fo);rewrite(f);
for i:=0 to 50000 do
for j:=0 to 7 do
if ((a[i] shr j) and 1)=1 then write(f,i*8+j,' ');
close(f);
end;
procedure tt;
var f:text; i,j,x:longint;
begin
assign(f,fi);rewrite(f);
writeln(f,maxn); randomize;
for i:=1 to maxn do
begin
Trang 11x:=0;
for j:=1 to 8 do x:=x+random(50000);
write(f,x,' ');
end;
close(f);
end;
begin xl; xuat; end
GAPMAT.PAS
Const Fi='gapmat.in2';
fo='gapmat.ou2';
type mmc=Array[0 32766] of integer;
Var a,d,c:^mmc; F :Text; n,max,vmax:integer; ti:longint;
Procedure Init;
Var i,j : integer;
Begin
Assign(f,fi); Reset(f);
Readln(f,n);
new(a);new(c);new(d);
for i:=0 to 32766 do a^[i]:=0;
For i:=1 to n do
Begin
Readln(f,d^[i],c^[i]);
for j:=d^[i] to c^[i] do a^[j]:=a^[j]+1;
End;
Close(f);
max:=a^[1]; vmax:=1;
for i:=0 to 32766 do
if max<a^[i] then
begin max:=a^[i]; vmax:=i; end;
assign(f,fo);rewrite(f); writeln(f,max);
for i:=1 to n do
if (vmax>=d^[i]) and (vmax<=c^[i]) then write(f,i,' ');
close(f);
End;
Begin Init; end
HCN.PAS
const fi='hcn.in1';
fo='hcn.ou1';
type mmc=array[0 101] of longint;
var f:text; n:word; a,b,qh,tr,cs:mmc;
procedure doc;
var i:word;t:longint;
begin
assign(f,fi);reset(f); readln(f,n);
a[0]:=0;b[0]:=0;
for i:=1 to n do
begin
readln(f,a[i],b[i]);
if a[i]> b[i] then
begin t:=a[i];a[i]:=b[i];b[i]:=t; end;
end;
Trang 12for i:=1 to n do cs[i]:=i;
end;
procedure sx;
var i,j:word; t:longint;
begin
for i:=1 to n-1 do
for j:=i+1 to n do
if a[i]>a[j] then
begin
t:=a[i];a[i]:=a[j];a[j]:=t;
t:=b[i];b[i]:=b[j];b[j]:=t;
t:=cs[i];cs[i]:=cs[j];cs[j]:=t;
end;
end;
procedure xl;
var i,j:word;
begin
sx; fillchar(qh,sizeof(qh),0);
for i:=1 to n do
for j:=0 to i-1 do
if (a[i]>a[j]) and (b[i]<b[j]) then
if qh[i]<qh[j]+1 then
begin qh[i]:=qh[j]+1; tr[i]:=j; end;
end;
procedure xuat;
var i,max,vt:word;
begin
assign(f,fo);rewrite(f); max:=qh[1]; vt:=1;
for i:=1 to n do
if max<qh[i] then begin max:=qh[i]; vt:=i;end;
i:=vt; writeln(f,max+1);
while i<>0 do
begin writeln(f,a[i],' ',b[i]); i:=tr[i]; end;
close(f);
end;
begin doc; xl; xuat; end
III/ Mét sè test gîi ý.
SAPDAY.PAS
10
6 9 8 7 1 2 3 4 5 10 1 2 3 4 5 6 7 8 9 10
3
4
4 6 400000 3 3 4 6 400000
3
400000 300000
200000
200000 300000 400000
Trang 136
1 6
2 5
3 4
4 5
3 7
6 7
5
1 2 3 4 5
5
1 32766
3 5
7 9
11 15
17 21
2
1 2
5
1 2
2 3
3 4
4 5
5 6
2
1 2
HCN.PAS
10
21 1
4 7
6 5
2 4
3 5
6 8
7 6
10 20
12 19
13 17
4
13 17
12 19
10 20
1 21
5
4 6
7 4
3 5
7 3
2 1
2
4 6
3 7
1
3 4 13 4
6
1 20
2 19
3 18
4 17
5 16
6 15
6
6 15
5 16
4 17
3 18
2 19
1 20
Trang 141 4
2 5
3 6
4 7
1 4
4
1 30000
2 29000
3 28000
30000 30000
3
3 28000
2 29000
1 30000
Giám khảo lu ý khi sử dụng các test để chấm bài:
+ Tổng số lợng hình chữ nhật của học sinh bắt buộc phải giống đáp án.
+ Chỉ số của các hình chữ nhật có thể có nhiều cách khác nhau.