Đề thi học sinh giỏi môn Tin học thành phố Hồ Chí Minh năm 2023 (đề – đáp án)

Bài thi được sưu tầm từ trang chuyentin.pro. Xin mời các bạn tham khảo đề thi và đáp án của đề thi học sinh giỏi môn Tin học thành phố Hồ Chí Minh năm học 2022-2023. Ở đây chúng tôi đã xây dựng hướng dẫn thuật toán và code giải các bài toán bằng ngôn ngữ lập trình Python.

Bài toán yêu cầu tìm mảng A biết mảng B, với giả định rằng B[i] là trung bình cộng của i phần tử đầu tiên của mảng A. Dưới đây là cách tiếp cận để giải quyết vấn đề này:

  1. Đầu tiên, ta biết rằng B[0] chính là giá trị của A[0].
  2. Tiếp theo, để tìm A[i] cho mọi i từ 1 đến n-1, ta sử dụng công thức sau: A[i] = B[i] * (i + 1) – B[i-1] * i

Với công thức này, ta có thể tìm được mảng A từ mảng B. Ta cần lặp qua mảng B từ đầu đến cuối và áp dụng công thức trên để tìm ra mảng A tương ứng.

def tinh_mang_A(B):
    n = len(B)
    A = [0] * n
    A[0] = B[0]  # Phần tử đầu tiên của A bằng B[0]
    
    for i in range(1, n):
        A[i] = (B[i] * (i + 1)) - sum(A[:i])
    
    return A

# Đọc dữ liệu từ file
with open('TBC1.INP', 'r') as file:
    n = int(file.readline())  # Đọc số lượng phần tử
    B = list(map(int, file.readline().split()))  # Đọc mảng B từ dòng thứ hai

# Tính toán mảng A từ mảng B
A = tinh_mang_A(B)

# Ghi kết quả vào file
with open('TBC1.OUT', 'w') as file:
    file.write(' '.join(map(str, A)) + '\n')

Để giải bài toán này, bạn cần thực hiện các bước sau:

  1. Đọc chuỗi mã hóa và danh sách các phương án thay thế từ file đầu vào.
  2. Tạo tất cả các biến thể có thể của chuỗi bằng cách thay thế dấu “#” bằng các phương án tương ứng.
  3. Tìm chuỗi cố định tại vị trí x trong tất cả các biến thể.
# Đọc dữ liệu từ file và giải mã
def giai_ma(file_input, file_output, x):
    with open(file_input, 'r') as f:
        n, m, k, x = map(int, f.readline().split())
        x -= 1  # Giảm x đi 1 vì chỉ số trong Python bắt đầu từ 0
        encrypted = f.readline().strip()
        replacements = [f.readline().strip() for _ in range(m)]

    # Kiểm tra từng biến thể
    fixed_char = None
    for i in range(k):
        if encrypted[i] == '#':
            # Lấy ra ký tự thứ x từ các phương án thay thế
            possible_chars = {replacement[i] for replacement in replacements}
            # Nếu chỉ có một ký tự có thể, gán vào fixed_char
            if len(possible_chars) == 1:
                char = possible_chars.pop()
                if fixed_char is None:
                    fixed_char = char
                elif fixed_char != char:
                    fixed_char = '?'  # Không tìm được ký tự cố định
                    break
            else:
                fixed_char = '?'  # Không tìm được ký tự cố định
                break

    # Ghi kết quả vào file
    with open(file_output, 'w') as f:
        f.write(fixed_char if fixed_char is not None else 'No unique character found at position {x+1}')

# Gọi hàm giải mã với file đầu vào và đầu ra
giai_ma(MATMA.INP', MATMA.OUT', x)

Bài toán này yêu cầu tìm tổng của số lớn nhất trong mỗi đoạn con không liên tiếp có kích thước K của mảng A, và lấy tổng này modulo 10^9+7.

Đây là một bài toán lập trình, và bạn có thể giải nó bằng cách sử dụng ngôn ngữ lập trình Python. Dưới đây là một cách tiếp cận để giải quyết bài toán:

  1. Tạo tất cả các đoạn con có kích thước K từ mảng A.
  2. Tìm số lớn nhất trong mỗi đoạn con.
  3. Tính tổng tất cả các số lớn nhất này.

Lấy tổng vừa tìm được modulo 10^9+7.

MOD = 10**9 + 7

def tinh_tong_so_lon_nhat(A, K):
    # Tìm số lớn nhất trong mỗi đoạn con có kích thước K và tính tổng
    tong = sum(max(A[i:i+K]) for i in range(len(A)-K+1))
    return tong % MOD

# Đọc dữ liệu từ file
with open('SOXO.INP', 'r') as file:
    n, K = map(int, file.readline().split())
    A = list(map(int, file.readline().split()))

# Tính toán và ghi kết quả
tong_tim_duoc = tinh_tong_so_lon_nhat(A, K)
with open('SOXO.OUT', 'w') as file:
    file.write(str(tong_tim_duoc))