hớng dẫn chấm vòng 1 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ả.. - 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: SO.PAS DAYSO
Trang 1Vòng 1
Câu 1: (3 điểm) Phân tích số Tên file bài làm: SO.PAS
Hãy phân tích số nguyên dơng N thành tổng các số nguyên dơng khác nhau sao cho tích của chúng là lớn nhất
Dữ liệu vào: Cho trong file SO.INP có cấu trúc nh sau:
Dòng 1: Ghi số N (1<N<32768)
Dữ liệu ra: Ghi ra file SO.OUT theo cấu trúc nh sau:
Dòng 1: Ghi số K là số lợng số hạng của cách phân tích
Dòng 2: Ghi K số hạng của cách phân tích theo thứ tự tăng dần Các số ghi cách nhau ít nhất một dấu cách
Ví dụ:
2 4 5 6
Câu 2: (3.5 điểm) Sắp xếp dãy số Tên file bài làm: DAYSO.PAS
Cho dãy số nguyên a1 ,a2 , , an (1<n<=1000; -32768<=ai <=32767) Hãy tìm cách thực hiện một số ít nhất phép đổi chỗ hai số hạng bất kỳ của dãy để thu đợc dãy số
mà số lẽ đứng ở vị trí lẽ, số chẵn đứng ở vị trí chẵn
Dữ liệu vào: Cho trong file DAYSO.INP có cấu trúc nh sau:
Dòng 1: Ghi số n (là số lợng các số trong dãy)
Dòng 2: Ghi n số ai Các số ghi cách nhau ít nhất một dấu cách
Dữ liệu ra: Ghi ra file DAYSO.OUT theo cấu trúc nh sau:
Dòng 1: Nếu không đổi đợc thì ghi -1
Nếu đổi đợc thì ghi số K là số lợng phép đổi chỗ cần thực hiện và K dòng tiếp theo: Mỗi dòng j ghi 2 số j1 j2 là chỉ số của hai số hạng cần đổi chỗ cho nhau ở lần
đổi chỗ thứ j Hai số j1 j2 ghi cách nhau ít nhất một dấu cách
Ví dụ:
1 2 3 4 6 5 5 6 1 3 2 5
Chú ý: Có thể có nhiều cách đổi chỗ, chỉ cần đa ra một cách đổi chỗ đúng.
Trang 2Câu 3: (3.5 điểm) Xếp hàng mua vé Tên file bài làm: TICK.PAS
Có N ngời (N nguyên, 1<N<=100) có tên là 1 N xếp hàng mua vé theo thứ tự ngời
có tên nhỏ hơn thì xếp trớc (và đợc mua trớc) Mỗi ngời chỉ đợc mua 1 vé cho mình
và có thể mua thêm 1 vé cho ngời đứng kế sau Ngời bán vé chỉ bán cho mỗi ngời không quá 2 vé Biết Ti là thời gian để ngời thứ i mua vé của mình (0<Ti<100, i=1 N) Nếu ngời i+1 nhờ ngời i mua hộ vé của mình thì thời gian để ngời i mua vé cho cả hai ngời là Ri (0<Ri<100, i=1 N-1)
Yêu cầu: Hãy xét xem ngời nào cần đứng lại mua vé, ngời nào cần rời khỏi hàng
và nhờ ngời đứng ngay trớc mình mua hộ vé sao cho tổng thời gian bán đủ vé cho N ngời
là nhỏ nhất
Dữ liệu vào: Cho trong file TICK.INP có cấu trúc nh sau:
Dòng 1: Ghi số N
Dòng 2: Ghi N số nguyên dơng Ti Các số ghi cách nhau ít nhất 1 dấu cách
Dòng 3: Ghi N-1 số nguyên dơng Ri Các số ghi cách nhau ít nhất 1 dấu cách
Dữ liệu ra: Ghi ra file TICK.OUT theo cấu trúc nh sau:
Dòng 1: Ghi số S là tổng thời gian bán vé nhỏ nhất tìm đợc
Dòng 2: Ghi tên các ngời còn ở lại trong hàng để mua vé theo thứ tự giảm dần
Ví dụ:
5
3 6 2 7 3
4 8 4 8
11
5 3 1
Lu ý: Trong trờng hợp có nhiều kết quả đúng, chỉ cần đa ra đợc một kết quả.
Trang 3hớng dẫn chấm vòng 1
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: SO.PAS DAYSO.PAS TICK.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
SO.PAS
{$r+}
const fi='so.in6'; fo='so.ou6';
type mmc=array[1 1000] of word;
var n,spt:word; a:mmc;
procedure doc;
var f:text;
begin
end;
procedure xl;
var i:word;
begin
i:=1;
while n>i+1 do
begin a[i]:=i+1; n:=n-(i+1); i:=i+1; end;
spt:=i-1;
while n>0 do
begin
i:=spt;
while (n>0) and (i>=1) do begin a[i]:=a[i]+1;n:=n-1;i:=i-1;end;
end;
end;
procedure xuat;
var f:text; i:word; tich:longint;
begin
assign(f,fo);rewrite(f); writeln(f,spt);
for i:=1 to spt do write(f,a[i],' ');
close(f);
end;
begin doc; xl; xuat; {readln;} end.
DAYSO.PAS
{$r+}
const fi='dayso.in7'; fo='dayso.ou7';
type mmc=array[0 10001] of integer;
var a,mcl,mlc:mmc; n:word;
procedure doc;
var f:text; i:word;
begin
Trang 4for i:=1 to n do read(f,a[i]);
close(f);
end;
procedure xl;
var i,lc,cl:word; f:text;
begin
lc:=0;cl:=0;
for i:=1 to n do
begin
if (i mod 2=0) and (a[i] mod 2<>0) then
begin lc:=lc+1; mlc[lc]:=i; end;
if (i mod 2<>0) and (a[i] mod 2=0) then
begin cl:=cl+1; mcl[cl]:=i; end;
end;
assign(f,fo);rewrite(f);
if lc=cl then
begin
writeln(f,cl);
for i:=1 to cl do writeln(f,mcl[i],' ',mlc[i]);
end
else writeln(f,-1);
close(f);
end;
begin doc; xl; end.
TICK.PAS
const maxn=100; fi='tick.in8'; fo='tick.ou8';
type mmc=array[1 maxn] of word;
var r,t,c:mmc;s:word; n:word;f:text;
procedure doc;
var i:word;
begin
assign(f,fi);reset(f); readln(f,n);
for i:=1 to n do read(f,t[i]); readln(f);
for i:=1 to n-1 do read(f,r[i]);
close(f);
end;
function min(a,b:word):word;
begin if a<b then min:=a else min:=b; end;
procedure xl;
var i:word;
begin
fillchar(c,sizeof(c),0); c[1]:=t[1];c[2]:=min(c[1]+t[2],r[1]);
for i:=3 to n do
c[i]:=min(c[i-1]+t[i],c[i-2]+r[i-1]);
end;
procedure xuat;
var i:word;
begin
assign(f,fo);rewrite(f);
i:=n;s:=c[i];writeln(f,s);
while i>2 do
if s=c[i-1]+t[i] then
begin write(f,i,' '); i:=i-1;s:=c[i]; end else
begin write(f,i-1,' '); i:=i-2;s:=c[i]; end; write(f,1); close(f);
end;
begin doc; xl; xuat; {readln;} end.
Trang 5III/ Một số test gợi ý.
SO.PAS
2 3 5
3 4 6 7
2 3 4 6 7 8
2 3 5 6 7 8 9 10 11 12 13 14
2 3 4 5 6 7 9 10 11 12 13 14 15
2 3 4 6
DAYSO.PAS
12
5 -3 7 5 3 4 6 4 2 1 2 2
3
7 2
9 4
11 10 12
4 3 7 5 3 4 6 4 2 1 2 2 -1
8
1 2 3 10 9 8 7 6
0
8
8
6
2
2 1
1
1 2
Giám khảo lu ý khi sử dụng các test để chấm bài
+ Số phép đổi chỗ của học sinh bắt buộc phải giống đáp án.
+ Trình tự đổi chỗ có thể có nhiều cách khác nhau
Trang 620
4 5 7 4 3 1 4 5 6 3 8 6 2 7 8 5 3 4 6 7
8 3 4 5 2 6 7 8 6 6 7 3 2 5 6 8 7 9 10
58
19 18 17 15 13 11 9 7 6 4 2 1
3
3 2 1
1 2
2
3 1
10
8 9 6 7 4 5 2 3 1 1
1 1 3 2 5 4 7 6 8
16
10 9 8 7 5 3 1
12
4 6 6 2 7 8 5 3 4 6 7 12
8 3 4 5 2 6 7 8 6 8 9
33
11 9 7 5 4 2 1
10
2 2 2 2 2 2 2 2 2 2
2 2 2 2 2 2 2 2 2
10
9 7 5 3 1
5
1 2 3 4 5
5 4 3 2
7
4 2 1
5
1 2 3 4 5
1 2 3 4
7
4 2 1
Giám khảo lu ý khi sử dụng các test để chấm bài
+ Tổng thời gian bán vé của học sinh bắt buộc phải giống đáp án.
+ Tên của ngời ở lại trong hàng có thể có nhiều cách khác nhau
Trang 7Vòng 2
Câu 1: (3.5 điểm) Chia bánh Tên file bài làm: CAKE.PAS
Trong buổi tối trung thu có một cái bánh hình tròn Bánh đợc viền quanh bởi N quả dâu và quả sim (1<N<=255) Tìm cách cắt bánh bằng một nhát dao để đợc hai phần sao cho số lợng quả dâu ở phần này bằng số lợng quả dâu ở phần kia và số lợng quả sim
ở phần này bằng số lợng quả sim ở phần kia
Dữ liệu vào: Cho trong file CAKE.INP có cấu trúc nh sau:
Dòng 1: Ghi số N là số lợng quả dâu và quả sim ở trên viền bánh
Dòng 2: Ghi dãy gồm N ký tự “D” hoặc “S” ghi liền nhau Các vị trí gắn quả trên bánh
đợc đánh số từ 1 đến N theo chiều kim đồng hồ bắt đầu từ một vị trí tuỳ ý
Dữ liệu ra: Ghi ra file CAKE.OUT có cấu trúc nh sau:
Dòng 1: Nếu không tìm đợc cách chia thì ghi số -1
Nếu tìm đợc cách chia thì ghi hai số nguyên dơng a, b (a<b) cho biết các quả ở vị trí a, a+1, , b là các quả thuộc cùng một trong hai phần bánh
Ví dụ:
Chú ý: Có thể có nhiều cách chia bánh, chỉ cần đa ra một cách chia đúng.
Câu 2: (3.5 điểm) Mật khẩu Tên file bài làm: PASS.PAS
Một nhóm gồm K học sinh (0<k<101) góp tiền mua một phần mềm dùng chung Khi cài đặt phần mềm này, ngời sử dụng phải nhập vào mật khẩu Khi biết các khách hàng là học sinh say mê Tin học, chủ cửa hàng đã đa cho mỗi học sinh i một con số xi
(1<=xi <=65535) và nói rằng “Mật khẩu để cài đặt là số nguyên dơng lớn nhất m mà tất cả các số tôi đã đa cho các bạn đều chia hết cho m”
Yêu cầu: Biết tất cả các số mà chủ cửa hàng đã đa cho các học sinh, hãy tìm mật khẩu
để cài đặt phần mềm
Dữ liệu vào: Cho trong file PASS.INP có cấu trúc nh sau:
Dòng 1: Ghi số K là số học sinh
Trang 8Dòng 2: Ghi K số nguyên dơng xi (i=1 k) mà ông chủ đã đa cho các học sinh, các số ghi cách nhau ít nhất một dấu cách
Dữ liệu ra: Ghi ra file PASS.OUT theo cấu trúc nh sau:
Dòng 1: Ghi số m là mật khẩu tìm đợc
Ví dụ:
30 75 60
Câu 3: (3 điểm) Lập lịch gia công trên hai máy Tên file bài làm: LICH.PAS
Có N chi tiết D1 D2 Dn (1<N<1001) Mỗi chi tiết trong N chi tiết cần phải đợc lần lợt gia công trên cả 2 máy A và B Bắt đầu gia công trên máy A, sau khi xong chuyển tiếp sang gia công trên máy B Giả thiết thời gian chuyển xem nh không đáng kể và hai máy A, B là cùng hoạt động song song Thời gian gia công chi tiết Di trên máy A là ai, trên máy B là bi (i=1 n) Hãy tìm trình tự gia công các chi tiết trên hai máy sao cho việc hoàn thành gia công tất cả N chi tiết là sớm nhất có thể đợc
Dữ liệu vào: Cho trong file LICH.INP có cấu trúc nh sau:
Dòng 1: Ghi số N (là số lợng chi tiết)
Dòng 2: Ghi N số ai (là thời gian gia công chi tiết Di trên máy A; 0<=ai<=32767)
Dòng 3: Ghi N số bi (là thời gian gia công chi tiết Di trên máy B; 0<=bi<=32767)
Dữ liệu ra: Ghi ra file LICH.OUT theo cấu trúc nh sau:
Dòng 1: Ghi thời gian hoàn thành sớm nhất tìm đợc
Dòng 2: Ghi N số là chỉ số của các chi tiết theo trình tự tìm đợc
Ví dụ
5
3 4 6 5 6
3 3 2 7 3
26
1 4 2 5 3
Chú ý: Có thể có nhiều cách sắp xếp trình tự gia công, chỉ cần đa ra một cách đúng.
Trang 9hớng dẫn chấm vòng 2
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 CAKE.PAS PASS.PAS LICH.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
II/ Ch ơng trình mẫu
CAKE.PAS
const fi='cake.in7'; fo='cake.ou7';
var s:string;n:integer;
procedure doc;
var f:text;
begin
assign(f,fi);reset(f);readln(f,n);readln(f,s);close(f);
end;
procedure demdn(s:string;var sd,sn:integer);
var i:integer;
begin
sd:=0;sn:=0;
for i:=1 to length(s) do
if s[i]='D' then sd:=sd+1 else sn:=sn+1;
end;
procedure xl;
var i, x:word;
f:text; d,c,ds,ns,ds1,ns1:integer; s1,s2:string;
begin
assign(f,fo);rewrite(f);
x:=n div 2;
if n mod 2=1 then write(f,-1)
else
begin
demdn(s,ds,ns);
if (ds mod 2=1) or (ns mod 2=1) then write(f,-1)
else
begin
for i:=1 to x do
begin
s2:=s; s1:=copy(s2,i,x); delete(s2,i,x); demdn(s1,ds1,ns1);
if (ds1=ds div 2) and (ns1=ns div 2) then
begin write(f,i,' ',i+x-1); break; end;
end;
end;
end;
Trang 10end;
begin doc; xl; end.
PASS.PAS
const fi='pass.in7'; fo='pass.ou7';
type mmc=array[1 101] of word;
var f:text; k:word; a:mmc;
procedure doc;
var i:word;
begin
assign(f,fi);reset(f); readln(f,k);
for i:=1 to k do read(f,a[i]);
close(f);
end;
function ucln(a,b:word):word;
begin
while a<>b do
begin if a>b then a:=a-b else b:=b-a; end;
ucln:=a;
end;
procedure xl;
var u,i:word;
begin
u:=a[1];
for i:=2 to k do u:=ucln(u,a[i]);
assign(f,fo);rewrite(f);write(f,u);close(f);
end;
begin
doc;xl;end.
LICH.PAS
var a: m1;
procedure doc_inp;
var f:text; i:integer;
begin
assign(f,fi);reset(f); readln(f,n);
for i:=1 to n do read(f,a[1,i]);
for i:=1 to n do read(f,a[2,i]);
close(f);
end;
function chitietmin(var may: byte): byte;
var i,j,chitiet:word;
begin
lmin := maxint;
for i:=1 to 2 do
for j:=n downto 1 do
if not dx[j] then
if (a[i,j]<lmin) then
begin may := i; chitiet:= j; lmin := a[i,j]; end; chitietmin := chitiet;
end;
procedure john;
var may,chitiet,dau,cuoi: byte;
Trang 11begin
fillchar(dx,sizeof(dx),false);
dau := 0; cuoi := n+1;
repeat
chitiet := chitietmin(may);
if may=1 then
begin
inc(dau); kq[dau]:= chitiet; dx[chitiet]:= true;
end
else
begin
dec(cuoi); kq[cuoi] := chitiet; dx[chitiet]:= true; end;
until dau = cuoi-1;
end;
procedure hien;
var i:integer;
begin for i:=1 to n do write(g,kq[i],' '); end;
function max2(a,b: real): real;
begin if a>b then max2:=a else max2:=b; end;
procedure tinh;
begin
t1:=0; t2:=0;
for i:=1 to n do
begin
t1 := t1 + a[1,kq[i]]; t2 := max2(t1,t2)+a[2,kq[i]];
end;
writeln(g,t2:0:0);
end;
III/ Một số test gợi ý.
CAKE.PAS
10
DDSDDDSDSS
3 7
20
30
SDSDDDDDSSSSDDDSDDDDSSDDDSSSDD 1 15
10
16
DDDDDDDDDDDDDDDD
1 8
4
4
Giám khảo lu ý khi sử dụng các test để chấm bài: Có thể có nhiều cách cắt đúng khác nhau Trên đây chỉ đa ra một cách cắt dúng
Trang 1210
25 35 75 5 20 40 50 125 55 45
5
20
3874 33314 49912 37822 14374 39488 24048 41264 25178
52384 34534 56834 35916 28756 34526 25506 21342 61186
57498 48510
2
30
1611 9 129 9 27 195 825 54 279 192 93 552 840 2790 72 45
2808 228 99 45 225 90 903 270 621 426 2604 522 18 99
3
8
2
10
1 1 1 1 1 1 1 1 1 1
1
10
LICH.PAS
5
3 4 6 5 6
3 3 2 7 3
26
1 4 2 5 3
10
3 4 6 5 6 7 6 5 4 8
3 3 2 7 3 8 7 5 7 4
56
1 9 8 4 7 6 10 2 5 3
15
3 4 6 5 6 4 6 3 2 6 7 8 7 5 3
3 3 2 7 3 8 7 3 2 6 7 5 3 2 1
76
9 8 1 6 4 10 7 11 12 2 5 13 3 14 15
2
1 2
2 1
4
1 2
2
1 2
1 2
5
1 2
10
6 5 3 4 5 4 1 6 5 6
1 2 4 5 3 3 2 7 3 8
46
7 3 4 10 8 5 6 9 2 1
Giám khảo lu ý khi sử dụng các test để chấm bài
+ Tổng thời gian ít nhất để hoàn thành gia công N chi tiết phải giống đáp án + Trình tự gia công có thể có nhiều cách khác nhau.
Trang 13Đề thi dự bị Vòng 1
Câu 1: (3 điểm) Luỹ thừa Tên file bài làm: LT.PAS
Viết chơng trình tính 2n với n chạy từ 1 đến 96 Kết quả đặt trong file LT.TXT có cấu trúc nh sau:
N dòng: Dòng thứ i ghi giá trị tính đợc của 2i
Câu 2: (3.5 điểm) Hoán vị nhỏ nhất Tên file bài làm: PER.PAS
Cho a là một hoán vị của các số tự nhiên 1 N (3<=N<=50) Tìm hoán vị nhỏ nhất b của 1 N thoả mãn điều kiện: Độ lệch của các phần tử tơng ứng giữa a và b là không quá 1 đơn vị
Dữ liệu vào: Cho trong file PER.INP có cấu trúc nh sau:
Dòng 1: Ghi số N
Dòng 2: Ghi N số xi (1<=xi<=N) là hoán vị của các số tự nhiên từ 1 đến N Các số ghi cách nhau ít nhất một dấu cách
Dữ liệu ra: Ghi ra file PER.OUT theo cấu trúc nh sau:
Dòng 1: Ghi N số yi (1<=yi<=N) là hoán vị nhỏ nhất b tìm đợc Các số ghi cách nhau
ít nhất một dấu cách
Ví dụ
7 5 6 8 4 1 3 2 Câu 3: (3.5 điểm) Mã Gray Tên file bài làm: GRAY.PAS
Mã Gray G(N) của một số tự nhiên N là một số tự nhiên P đợc xác định nh sau: -Viết N dới dạng nhị phân C
-Dịch C sang phải 1 bít (Bỏ bít đầu phải, thêm bít 0 vào đầu trái)
-Gọi số thu đợc là D
-Thực hiện phép XOR theo bít giữa C và D để thu đợc số nhị phân K
-Chuyển K sang dạng thập phân để thu đợc số P
Khi đó ta có: G(N)=P
(Phép XOR giữa hai bít a và b cho ta giá trị 0 nếu 2 bít giống nhau, cho ta giá trị 1 nếu 2 bít khác nhau)
Yêu cầu: Tính N khi biết P (0<=P<=2000000000)
Dữ liệu vào: Cho trong file GRAY.INP có cấu trúc nh sau:
Dòng 1: Ghi số P
Dữ liệu ra: Ghi ra file GRAY.OUT theo cấu trúc nh sau:
Dòng 1: Ghi số N
Ví dụ