Đề thi học sinh giỏi môn Tin học thành phố Yên Bái năm học 2021-2022 (THCS)
TỔNG QUAN VỀ ĐỀ THI:
|
File chương trình |
File dữ liệu vào |
File dữ liệu ra |
Câu 1 |
ASMIMA.* |
ASMIMA.INP |
ASMIMA.OUT |
Câu 2 |
BSCH.* |
BSCH.INP |
BSCH.OUT |
Câu 3 |
CPPR.* |
CPPR.INP |
CPPR.OUT |
Câu 4 |
DRSEL.* |
DRSEL.INP |
DRSEL.OUT |
Câu 1. (6,0 điểm) Món quà
Ban tổ chức có bốn phần thưởng giá trị lần lượt là M, N, P và Q. Jame được chọn hai món quà. Hãy cho biết tổng giá trị các món quà lớn nhất và nhỏ nhất mà Jame có thể nhận được.
Dữ liệu: Vào từ tệp văn bản ASMIMA.INP ghi số nguyên dương M, N, P, Q (M, N, P, Q ≤ 109).
Kết quả: Ghi ra tệp văn bản ASMIMA.OUT tổng giá trị các món quà lớn nhất và nhỏ nhất mà Jame có thể nhận được.
Mỗi số cách nhau một dấu cách.
ASMIMA.INP |
ASMIMA.OUT |
5 2 7 6 |
13 7 |
Câu 2. (6,0 điểm) Xếp hàng
Lớp học có N học sinh, học sinh thứ i cao ai (cm). Lớp trưởng lần lượt thực hiện:
- Xếp hàng các bạn học sinh tăng dần theo chiều cao và lần lượt thông báo chiều cao của các bạn từ đầu hàng đến cuối hàng.
- Xếp hàng các bạn học sinh giảm dần theo chiều cao và lần lượt thông báo chiều cao của các bạn từ đầu hàng đến cuối hàng.
- Thông báo độ chênh lệch chiều cao của bạn cao nhất với chiều cao của bạn thấp nhất trong lớp.
Dữ liệu: Vào từ tệp văn bản BSCH.INP gồm:
- Dòng 1: Ghi số nguyên dương N là số lượng học sinh (N ≤ 105).
- Dòng 2: Ghi N số nguyên dương ai là chiều cao của học sinh thứ i (ai ≤ 109).
Kết quả: Ghi ra tệp văn bản BSCH.OUT gồm:
- Dòng 1: Ghi chiều cao của các học sinh tăng dần.
- Dòng 2: Ghi chiều cao của các học sinh giảm dần.
- Dòng 3: Ghi độ chênh lệch chiều cao của bạn cao nhất với chiều cao của bạn thấp nhất.
Mỗi số cách nhau một dấu cách.
BSCH.INP |
BSCH.OUT |
|
5 157 156 152 157 155 |
152 155 156 157 157 157 157 156 155 152 5 |
|
Câu 3. (5,0 điểm) Số nguyên
Số Palidrom là số đối xứng, nghĩa là đọc từ trái sang phải hay từ phải sang trái ta đều được một số. Ví dụ: Các số Palidrom 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 121, 1331, 2222, 1556551,…
Số nguyên tố là số nguyên dương lớn hơn 1 và chỉ có hai ước nguyên dương. Ví dụ: Các số nguyên tố 2, 3, 5, 7, 11, 13, 17, 19, 23…
Cho số nguyên N. Đếm số lượng các số nhỏ hơn hoặc bằng N là số nguyên tố và không là số Palidrom.
Ví dụ: N = 20 có các số là số nguyên tố và không là số Palidrom là: 13, 17, 19.
Dữ liệu: Vào từ tệp văn bản CPPR.INP ghi số nguyên dương N (2 ≤ N ≤ 106).
Kết quả: Ghi ra tệp văn bản CPPR.OUT gồm một dòng ghi số lượng các số nhỏ hơn hoặc bằng N là số nguyên tố và không là số Palidrom.
CPPR.INP |
CPPR.OUT |
20 |
3 |
Câu 4. (3,0 điểm) Trò chơi
Jame tham gia trò chơi truyền hình thực tế. Ở trò chơi này Ban tổ chức có N món quà, món quà thứ i có giá trị ai và khối lượng ci. Jame chỉ được chọn một số món quà sao cho tổng khối lượng các món quà được chọn nhỏ hơn hoặc bằng R và tổng giá trị các món quà được chọn là lớn nhất.
Yêu cầu: Hãy xác định tổng giá trị món quà lớn nhất mà Jame có thể nhận được.
Dữ liệu: Vào từ tệp văn bản DRSEL.INP gồm:
- Dòng 1: Ghi số nguyên dương N và R (N ≤ 20, R ≤ 109).
- Trong N dòng tiếp theo, dòng thứ i ghi số nguyên dương ai và ci (ai, ci ≤ 109).
Dữ liệu vào đảm bảo có ít nhất một cách chọn món quà.
Kết quả: Ghi ra tệp văn bản DRSEL.OUT gồm một dòng duy nhất ghi tổng giá trị món quà lớn nhất mà Jame có thể nhận được.
DRSEL.INP |
DRSEL.OUT |
Giải thích |
5 17 5 3 2 4 3 6 6 2 8 5 |
22
|
Chọn món quà thứ tự 1, 3, 4, 5 có tổng khối lượng là 16 nhỏ hơn hoặc bằng 17 và tổng giá trị lớn nhất là 22. |
Lời giải tham khảo
Câu 1. (6,0 điểm) Món quà
Python
with open('ASMIMA.INP', 'r') as f_input:
m, n, p, q = map(int, f_input.readline().split())
lst = [m, n, p, q]
lst.sort(reverse=True)
max_sum = lst[0] + lst[1]
min_sum = lst[2] + lst[3]
with open('ASMIMA.OUT', 'w') as f_output:
f_output.write('{} {}'.format(max_sum, min_sum))
C++
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
int main() {
ifstream fin("ASMIMA.INP");
ofstream fout("ASMIMA.OUT");
int m, n, p, q;
fin >> m >> n >> p >> q;
int lst[] = {m, n, p, q};
sort(lst, lst+4, greater<int>());
int max_sum = lst[0] + lst[1];
int min_sum = lst[2] + lst[3];
fout << max_sum << " " << min_sum;
fin.close();
fout.close();
return 0;
}
Pascal
program ASMIMA;
var
f_input, f_output: TextFile;
m, n, p, q, max_sum, min_sum: Integer;
lst: array[1..4] of Integer;
i: Integer;
begin
AssignFile(f_input, 'ASMIMA.INP');
Reset(f_input);
ReadLn(f_input, m, n, p, q);
CloseFile(f_input);
lst[1] := m;
lst[2] := n;
lst[3] := p;
lst[4] := q;
for i := 1 to 4 do
for j := i + 1 to 4 do
if lst[i] < lst[j] then
begin
temp := lst[i];
lst[i] := lst[j];
lst[j] := temp;
end;
max_sum := lst[1] + lst[2];
min_sum := lst[3] + lst[4];
AssignFile(f_output, 'ASMIMA.OUT');
Rewrite(f_output);
Write(f_output, max_sum, ' ', min_sum);
CloseFile(f_output);
end.
Câu 2. (6,0 điểm) Xếp hàng
Python
# Đọc dữ liệu vào từ file
with open('BSCH.INP', 'r') as f:
n = int(f.readline().strip())
a = list(map(int, f.readline().strip().split()))
# Xếp hàng tăng dần theo chiều cao
a_sort_inc = sorted(a)
print(*a_sort_inc)
# Xếp hàng giảm dần theo chiều cao
a_sort_dec = sorted(a, reverse=True)
print(*a_sort_dec)
# Tính độ chênh lệch chiều cao của bạn cao nhất và bạn thấp nhất
diff = a_sort_dec[0] - a_sort_inc[0]
print(diff)
# Ghi kết quả ra file
with open('BSCH.OUT', 'w') as f:
f.write(' '.join(map(str, a_sort_inc)) + '\n')
f.write(' '.join(map(str, a_sort_dec)) + '\n')
f.write(str(diff))
C++
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
int main() {
freopen("BSCH.INP", "r", stdin);
freopen("BSCH.OUT", "w", stdout);
int n;
cin >> n;
vector<int> a(n);
for (int i = 0; i < n; i++) {
cin >> a[i];
}
// Sap xep tang dan
sort(a.begin(), a.end());
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
// Sap xep giam dan
sort(a.begin(), a.end(), greater<int>());
for (int i = 0; i < n; i++) {
cout << a[i] << " ";
}
cout << endl;
// Tim do chenh lech
int max_height = a[0];
int min_height = a[n-1];
cout << max_height - min_height << endl;
return 0;
}
Pascal
program BSCH;
var
n, i, max_height, min_height: longint;
a: array of longint;
begin
Assign(input, 'BSCH.INP');
Assign(output, 'BSCH.OUT');
Reset(input);
Rewrite(output);
// Doc du lieu
ReadLn(n);
SetLength(a, n);
for i := 0 to n-1 do
Read(a[i]);
// Sap xep tang dan
for i := 0 to n-1 do
Write(a[i], ' ');
WriteLn;
// Sap xep giam dan
for i := n-1 downto 0 do
Write(a[i], ' ');
WriteLn;
// Tim do chenh lech
max_height := a[0];
min_height := a[n-1];
WriteLn(max_height - min_height);
Close(input);
Close(output);
end.
Câu 3. (5,0 điểm) Số nguyên
Python
def is_prime(n):
if n < 2:
return False
for i in range(2, int(n ** 0.5) + 1):
if n % i == 0:
return False
return True
def is_palindrome(n):
return str(n) == str(n)[::-1]
with open('CPPR.INP', 'r') as f_in, open('CPPR.OUT', 'w') as f_out:
n = int(f_in.readline().strip())
count = 0
for i in range(2, n+1):
if is_prime(i) and not is_palindrome(i):
count += 1
f_out.write(str(count))
C++
#include <bits/stdc++.h>
using namespace std;
// Hàm kiểm tra xem một số có phải là số Palindrome không
bool isPalindrome(int n) {
int m = n, rev = 0;
while (m > 0) {
rev = rev * 10 + m % 10;
m /= 10;
}
return (n == rev);
}
// Hàm kiểm tra xem một số có phải là số nguyên tố không
bool isPrime(int n) {
if (n < 2) return false;
for (int i = 2; i <= sqrt(n); i++) {
if (n % i == 0) return false;
}
return true;
}
int main() {
freopen("CPPR.INP", "r", stdin);
freopen("CPPR.OUT", "w", stdout);
int n, count = 0;
cin >> n;
for (int i = 2; i <= n; i++) {
if (isPrime(i) && !isPalindrome(i)) {
count++;
}
}
cout << count;
return 0;
}
Pascal
program palidrom;
var
N, i, j, count: longint;
function isPrime(num: longint): boolean;
var
i: longint;
begin
if num < 2 then
isPrime := false
else if num = 2 then
isPrime := true
else if num mod 2 = 0 then
isPrime := false
else begin
i := 3;
while i <= trunc(sqrt(num)) do
begin
if num mod i = 0 then
begin
isPrime := false;
exit;
end;
i := i + 2;
end;
isPrime := true;
end;
end;
function isPalidrom(num: longint): boolean;
var
reverse, original: longint;
begin
original := num;
reverse := 0;
while num <> 0 do
begin
reverse := reverse * 10 + num mod 10;
num := num div 10;
end;
if original = reverse then
isPalidrom := true
else
isPalidrom := false;
end;
begin
assign(input, 'CPPR.INP');
assign(output, 'CPPR.OUT');
reset(input);
rewrite(output);
readln(N);
count := 0;
for i := 2 to N do
begin
if (isPrime(i) = true) and (isPalidrom(i) = false) then
count := count + 1;
end;
writeln(count);
close(input);
close(output);
end.
Câu 4. (3,0 điểm) Trò chơi
Python
with open('DRSEL.INP', 'r') as f:
n, r = map(int, f.readline().split())
gifts = []
for i in range(n):
a, c = map(int, f.readline().split())
gifts.append((a, c))
dp = [0] * (r+1)
for i in range(1, r+1):
for a, c in gifts:
if c <= i:
dp[i] = max(dp[i], dp[i-c] + a)
with open('DRSEL.OUT', 'w') as f:
f.write(str(dp[r]))
C++
#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int n, r;
int a[N], c[N];
int dp[1 << N];
int main() {
freopen("DRSEL.INP", "r", stdin);
freopen("DRSEL.OUT", "w", stdout);
cin >> n >> r;
for (int i = 0; i < n; i++) {
cin >> a[i] >> c[i];
}
for (int mask = 0; mask < (1 << n); mask++) {
int total_c = 0, total_a = 0;
for (int i = 0; i < n; i++) {
if (mask & (1 << i)) {
total_c += c[i];
total_a += a[i];
}
}
if (total_c <= r) {
dp[mask] = total_a;
}
}
for (int mask = 0; mask < (1 << n); mask++) {
for (int i = 0; i < n; i++) {
if (!(mask & (1 << i))) {
dp[mask | (1 << i)] = max(dp[mask | (1 << i)], dp[mask] + a[i]);
}
}
}
cout << dp[(1 << n) - 1] << endl;
return 0;
}
Pascal
const
MAXN = 20;
MAXR = 1000000000;
var
N, R, i, j: longint;
a, c: array[1..MAXN] of longint;
f: array[0..MAXR] of longint;
begin
assign(input, 'DRSEL.INP'); reset(input);
assign(output, 'DRSEL.OUT'); rewrite(output);
readln(N, R);
for i := 1 to N do
readln(a[i], c[i]);
fillchar(f, sizeof(f), 0);
for i := 1 to N do
for j := R downto c[i] do
f[j] := max(f[j], f[j - c[i]] + a[i]);
writeln(f[R]);
close(input); close(output);
end.