Đề, đáp án thi học sinh giỏi thành phố Yên Bái năm học 2021-2022

Đề thi học sinh giỏi

Đề 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.

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *