Khi một khách hàng muốn rút M đồng, máy ATM sẽ nhả ra m tờ tiền mà có tổng là W đồng. Cho biết cách thanh toán cần ít số lượng tờ tiền nhất cho số tiền cần thanh toán là W[r]
(1)SỞ GD&ĐT VĨNH PHÚC TRƯỜNG THPT YÊN LẠC 2
KÌ THI KSCL ĐỘI TUYỂN HỌC SINH GIỎI KHỐI 12 ĐỀ THI MÔN: TIN HỌC 12
NĂM HỌC 2018 - 2019
Thời gian làm 180 phút, không kể thời gian giao đề. Đề thi gồm có 03 02 Trang
Tổng quan đề thi
Tên bài File chương trình File Input File Output Thời gian Điểm
Bài 1 DEM.* DEM.inp DEM.out 1s / test 6
Bài 2 TACH.* TACH.inp TACH.out 1s / test 6
Bài 3 ATM.* ATM.inp ATM.out 1s / test 8
Chú ý: Thí sinh thay * tên chương trình PAS CPP tùy theo ngơn ngữ lập trình mà thí sinh sử dụng PASCAL C++.
Bài 1: Đếm số bên phải
Cho số nguyên n Hãy đếm xem kết số n! (n giai thừa) có chữ số liên tiếp tính từ hàng đơn vị (hay số liên tiếp bên phải)
Dữ liệu vào
- Một dòng chứa số nguyên n (1 ≤ n ≤ 1.000) Dữ liệu xuất:
- Một dòng ghi số lượng chữ số liên tiếp tính từ hàng đơn vị n! Ví dụ
Input Output
8
Giải thích 8! = 5040
Bài 2: Tách chuỗi đối xứng
Chuỗi đối xứng (palindrome) chuỗi mà ta đọc từ trái sang phải hay từ phải sang trái giống Ví dụ chuỗi 'abcba' chuỗi đối xứng Một ký tự gọi chuỗi đối xứng
Một chuỗi S ln ghép từ chuỗi đối xứng Ví dụ chuỗi 'bobseesanna' có số cách ghép sau:
1) 'b' + 'o' + 'b' + 'sees' + 'a' + 'n' + 'n' + 'a' 2) 'bob' + 'sees' + 'anna'
3) 'bob' + 's' + 'ee' + 's' + 'anna'
Tổng quát S = P1 + P2 + + Pk với P1, P2, , Pk chuỗi đối xứng Bạn tìm cách biểu diễn S cho k bé Trong ví dụ trên, k = (cách ghép số 2)
Dữ liệu vào:
- Dòng thứ số nguyên n (1 ≤ n ≤ 2.000) biểu thị chiều dài chuỗi S - Dòng thứ hai chuỗi S gồm n ký tự chữ la tinh thường từ a đến z Dữ liệu ra:
(2)- Trong k dòng tiếp theo, dòng thứ i chuỗi đối xứng Pi Nếu có nhiều cách biểu diễn, cần in cách
Ví dụ
Input output
11
bobseesanna
3 bob sees anna
Bài 3: Máy rút tiền ATM
Vinh làm việc cho công ty sản xuất máy ATM Chức máy ATM rút tiền mặt Khi khách hàng muốn rút M đồng, máy ATM nhả m tờ tiền mà có tổng W đồng Trong máy ATM hệ tiếp theo, Vinh xây dựng thuật toán để tìm W (số lượng tờ tiền)
Giả sử máy ATM có N loại tiền: 1, 2, 3, , n; loại có mệnh giá tương ứng v[1] < v[2] < v[3] < < v[n] Cho biết cách toán cần số lượng tờ tiền cho số tiền cần toán W Bạn giúp Vinh viết chương trình thực yêu cầu Biết số tiền ATM lớn số tiền cần rút
Dữ liệu vào: Gồm dòng
Dòng 1: Chứa số nguyên dương N N số nguyên loại tiền đơn vị tính đồng v[1]… v[N]
Dòng 2: Chứa M số tiền khách hàng muốn rút tính đồng Dữ liệu xuất: Gồm nhiều dòng
Dòng 1: Ghi số W số lượng tờ tiền
Dịng trở đi: Gồm số W1 W2 W1 số tờ tiền tương ứng mệnh giá W2 Nếu cách rút tiền ghi file dịng chữ “nhap lai so tien”
Ví dụ
Input Output
4
10 20 50 100 450
5 100 50
-Hết -Thí sinh khơng sử dụng tài liệu để làm bài
Cán coi thi khơng giải thích them
(3)SỞ GD&ĐT VĨNH PHÚC TRƯỜNG THPT YÊN LẠC 2
ĐÁP ÁN KSCL ĐỘI TUYỂN HỌC SINH GIỎI KHỐI 12 ĐỀ THI MÔN: TIN HỌC 12
NĂM HỌC 2018 - 2019
Thời gian làm 180 phút, khơng kể thời gian giao đề. Đề thi gồm có 03 02 Trang
Bài 1: Đếm số bên phải Chương trình mẫu
var a,d,i,e:longint; f1,f2 :text; begin
assign(f1,’dem.inp’); reset(f1); assign(f2,’dem.out’);rewrite(f2); readln(f1,a);
d:= 0;
for i:=1 to a begin
e:=i;
while e mod = begin
inc(d); e := e div 5; end;
end;
writeln(f2,d); close(f1); close(f2); end
Đáp án:
Bài 2: Tách chuỗi đối xứng var i,j,n,m,t:longint;
a:array[0 100000] of char;
f:array[0 10000,0 10000] of longint; k,d,kt:array[-10000 10000] of longint; //f1, f2:text;
procedure motep; begin
assign(f1,'TACH.inp'); reset(f1); readln(f1,n);
for i:=1 to n read(f1,a[i]); assign(f2,'TACH.out'); rewrite(f2); end;
procedure xuli; begin
for i:=n downto begin
f[i,i]:=1; if i<>n then
if a[i]=a[i+1] then f[i,i+1]:=1; for j:=i+2 to n
if (a[i]=a[j]) and (f[i+1,j-1]=1) then f[i,j]:=1; end;
(4)d[0]:=0; for i:=1 to n for j:=1 to n begin
if f[i,j]=1 then
if d[j]>=d[i-1]+1 then begin
d[j]:=d[i-1]+1; kt[j]:=i; end;
end; writeln(d[n]); t:=n;
while t>0 begin
k[kt[t]-1]:=1; t:=kt[t]-1; end;
for i:=1 to n begin
write(a[i]);
if k[i]=1 then writeln; end;
close(f1); close(f2); end;
begin motep; xuli; end
Bài 3: Rút tiền ATM
*Đặt lại tốn: Có N loại tiền: 1, 2, 3, , n; loại có mệnh giá tương ứng v[1] < v[2] < v[3] < < v[n] Cho biết cách tốn cần số lượng tờ tiền cho số tiền cần toán M
Cách giải
Gọi F[i, j] số lượng tờ tiền cần trả (cách trả cần tờ tiền nhất) có sử dụng i loại tờ tiền (1, 2, 3, , i) cho số tiền j
Giá trị cuối cùng: F[N, M] kết cách toán; dùng N loại tờ tiền (1, 2, 3, , N) cho số tiền M
*Công thức truy hồi: với việc chọn tối ưu số loại tiền 1, 2, 3, , i để toán số tiền j, F[i, j] có khả năng:
1) F[i, j] = F[i-1, j]; Không dùng loại tiền i để toán số tiền j.
2) F[i, j] = + F[i, j-v[i]]; Có dùng loại tiền i để toán số tiền j (đk: j >= v[i]).
F[i, j] cách trả cần tờ tiền nhất, giá trị thu
*Cơ sở quy hoạch động:
(5)F[i, 0] = 0; (1<=i<=N) khơng có cách trả cho số tiền = {Quy Hoach Dong, Rut tien}
Program OptimizeCurrency;
Const NMax = 500; MMax = 65535; Var currency : Array[1 NMax] of Word; value : Array[1 NMax] of Word; F : Array[0 NMax, MMax] of Word; N, M : Word;
Procedure Init; Var i : Word; Begin
assign(f1,'ATM.inp'); reset(f1); assign(f2,'ATM.out'); rewrite(f2); readln(f1,n);
For i := to N Begin
Read(f1,currency[i]); value[i] := currency[i]; End;
Readln(f1); Readln(f1,M); For i := to M F[0, i] := M+1; For i := to N F[i, 0] := 0; End;
Procedure Optimize; Var i,j : Word; Begin
For i := to N For j := to M Begin
F[i, j] := F[i-1, j];
If (j >= value[i]) And (F[i, j] >= + F[i, j - value[i]]) Then F[i, j] := + F[i, j - value[i]];
End; End;
Procedure Result; Var i, j, c: Word; Begin
If F[N, M] = M+1 Then
Writeln(f2,'Khong the toan!') Else
Begin
Writeln(f2,'So luong to tien can tra cho so tien ', M, ' la: ', F[N, M]); Writeln('Cu the, cac loai to tien duoc toan la: ');
(6)If F[i, j] < F[i-1, j] Then Begin
{Co dung loai tien i}
Writeln('To tien thu ', c , ' - loai: ', currency[i]); j := j - value[i];
c := c + 1; End
Else Begin
{Khong dung loai tien i} i := i - 1;
(7)Hướng dẫn chấm Bài 1
Test Input Output Điểm
1 0.5
2 0.5
3 20 0.5
4 25 0.5
5 49 10 0.5
6 124 28 0.5
7 625 156 0.75
8 874 215 0.75
9 875 218 0.75
10 999 246 0.75
Bài 2
Test Input Output Điểm
1
11
bobseesanna 3bob
sees anna 0.5 noon noon 0.5 ab a b 0.5 google goog l e 0.5
abcbxbcby 3a
(8)bcdefghijkkjihgfedcbbcdefghijkkji hgfedcbbcdefghijkkjihgfedcb
9
81
abcdefghijkkjihgfedcbbcdefghijkkji hgfedcbbcdefghijkkjihgfedcbbcdefg hijkkjihgfedcb
2 a
bcdefghijkkjihgfedcbbcdefghijkkji hgfedcbbcdefghijkkjihgfedcbbcdef ghijkkjihgfedcb
0.75
10 100
bbcdabdcaacdaabdadaaacbbdcababa cacbbddcabadbaabdbaddbaddacccaa dbaaaadbacacadbadcccdbddbadccac dbabbbd
47 bb c d a b dcaacd aa b dad aaa c bb d c ababa cac bb dd c aba dbaabd b a dd b adda ccc aa d b aaaa d b acaca d b a dcccd bddb a d c cac d
(9)bab bb d
11
640
bcdefghijklmnopqrstuutsrqponmlkji hgfedcbbcdefghijklmnopqrStuutsrqp onmlkjihgfedcbbcdefghijklmnopqrst uutsrqponmlkjihgfedcbbcdeFghijkl mnopqrstuutsrqponmlkjihgfedcbbcd efghijklmnopqrstuutsrqponmlkjIhgf edcbbcdefghijklmnopqrstuutsrqpon mlkjihgfedcbbcdefghijklmnopqrstuu tsrqpOnmlkjihgfedcbbcdefghijklmn opqrstuutsrqponmlkjihgfedcbbcdefg hijklmnopqrstuutsrqponmlkjihgfedc bbcdefghijklmnopqrstuutsrqponmlkj i
1
bcdefghIjklmnopqrstuutsrqponmlk jihgfedcbbcdEfghijklmnopqrstuuts rqponmlkjihgfedCbbcdefghijklmn opqrstuutsrqponmlkjihgfEdcbbcde fghijklmnopqrstuutsrqponmlkJihgf edcbbcdefghijklmnopqrstuutsrqpo
nmlkjihg 0.75
Bài 3:
Test Input Output Điểm
1
10 20 50 100 450
5 100 50
2.0
2
10 20 50 100 200 755
Nhap lai so tien
2.0
3
10 20 50 100 200 10000
500
500 200 2.0
4
10 20 50 100 200 1240
62 60 200 20
2.0