NỘI DUNG
Đề thi Tin học trẻ tỉnh Yên Bái năm 2023 – Bảng B (khối THCS)
Câu 1. Đua Robot
Có hai robot đang chuyển động thẳng đều, cùng chiều trên cùng một con đường, robot thứ nhất đang ở vị trí s1 di chuyển với vận tốc là v1 m/s, robot thứ hai đang ở vị trí s2 di chuyển với vận tốc v2 m/s. Hỏi sau bao nhiêu lâu thì hai robot gặp nhau?
Dữ liệu vào từ file văn bản BAI1.INP:
– Dòng đầu tiên gồm số nguyên dương s1 mô tả vị trí của robot thứ nhất;
– Dòng thứ hai gồm số nguyên dương v1 mô tả vận tốc của robot thứ nhất;
– Dòng thứ ba gồm số nguyên dương s2 mô tả vị trí của robot thứ hai;
– Dòng thứ tư gồm số nguyên dương v2 mô tả vận tốc của robot thứ hai;
Các đơn vị khoảng cách được tính bằng mét, thời gian được tính bằng giây và s1 ≠ s2; s1, s2, v1, v2 ≤ 109.
Kết quả ghi ra file BAI1.OUT:
In ra một số nguyên là phần nguyên của kết quả – thời gian mà hai robot gặp nhau. Nếu hai robot không thể gặp nhau thì in ra -1.
Ví dụ:
BAI1.INP | BAI1.OUT |
2
5 7 3 |
2 |
Câu 2. Chuỗi ARN
Trong phòng thí nghiệm, các nhà khoa học đang nghiên cứu về gen của một chuỗi ARN đặc biệt được mã hóa bằng một xâu s gồm các ký tự A,U,G,X. Họ muốn cắt từ chuỗi ARN đó một mạch (được mã hóa bằng xâu x) cho trước.
Yêu cầu: Từ chuỗi ARN có thể cắt được tối đa bao nhiêu đoạn mạch x.
Dữ liệu vào từ file văn bản BAI2.INP
– Dòng đầu tiên gồm một xâu ký tự s mô tả chuỗi ARN.
– Dòng thứ hai gồm xâu ký tự x mô tả đoạn mạch cần cắt ra.
Các xâu chỉ gồm các ký tự A,U,G,X và độ dài các xâu không quá 103 ký tự.
Kết quả ghi ra file văn bản BAI2.OUT
Một số nguyên duy nhất là kết quả của bài toán.
Ví dụ:
BAI2.INP | BAI2.OUT |
AUAUGXXAUGXGX
AUGX |
2 |
AAAA
AAA |
1 |
AGAX
U |
0 |
Câu 3. Thử tài nhanh trí
Ở đất nước Ba Lan xinh đẹp có nàng công chúa tới tuổi kén chồng. Nhà vua muốn tìm ra một chàng rể thông minh kiệt xuất xứng với công chúa nên đã đề ra cuộc thi “Thử tài nhanh trí”. Nội dung của cuộc thi là chàng hoàng tử nào nhanh chóng đưa ra kết quả của nhà vua trong thời gian tối đa 1s sẽ được gặp mặt công chúa. Là một nhà lập trình tài ba, bạn hãy giúp các chàng hoàng tử nhé.
Cho số tự nhiên n (n ≥ 2), ta có thể phân tích n thành tích các thừa số nguyên tố với dạng n = p1^x1 * p2 ^x2 * … *pk^xk. Trong đó, p1 < p2 < …. < pk là các số nguyên tố và x1, x2, … xk > 0. Gọi s là tổng các số mũ x1 có giá trị lẻ.
Chú ý là s + p = x1 + x2 + … + xk.
Yêu cầu: Hãy đưa ra giá trị s và p
Dữ liệu: Cho file văn bản BAI3.INP gồm một số tự nhiên n (n ≥ 2).
Kết quả: Ghi ra file văn bản BAI3.OUT gồm 2 dòng:
– Dòng thứ nhất ghi giá trị của s
– Dòng thứ hai ghi giá trị của p
Ví dụ:
BAI3.INP | BAI3.OUT |
20 | 2
1 |
420 | 2
3 |
3 | 0
1 |
4 | 2
0 |
Đáp án Câu 1. Đua Robot
Cài đặt Câu 1 bằng ngôn ngữ lập trình Python
# Đọc dữ liệu từ file BAI1.INP
with open("BAI1.INP", "r") as f:
s1 = int(f.readline())
v1 = int(f.readline())
s2 = int(f.readline())
v2 = int(f.readline())
# Tính khoảng cách giữa hai robot
d = abs(s2 - s1)
# Kiểm tra nếu hai robot di chuyển cùng vận tốc
if v1 == v2:
result = -1
else:
# Tính thời gian mà hai robot gặp nhau
t = d / abs(v1 - v2)
result = int(t) # Lưu phần nguyên của t
# Ghi kết quả vào file BAI1.OUT
with open("BAI1.OUT", "w") as out_file:
out_file.write(str(result))
Cài đặt Câu 1 bằng ngôn ngữ lập trình C++
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
int main() {
freopen("BAI1.INP", "r", stdin);
freopen("BAI1.OUT", "w", stdout);
int s1, v1, s2, v2;
cin >> s1 >> v1 >> s2 >> v2;
// Tính khoảng cách giữa hai robot
int d = abs(s2 - s1);
// Kiểm tra nếu hai robot di chuyển cùng vận tốc
if (v1 == v2) {
cout << -1 << endl;
} else {
// Tính thời gian mà hai robot gặp nhau
double t = static_cast<double>(d) / abs(v1 - v2);
cout << static_cast<int>(t) << endl; // In ra phần nguyên của t
}
return 0;
}
Đáp án Câu 2. Chuỗi ARN
Cài đặt Câu 2 bằng ngôn ngữ lập trình Python
# Đọc dữ liệu từ file BAI2.INP
with open("BAI2.INP", "r") as f:
s = f.readline().strip() # Chuỗi ARN
x = f.readline().strip() # Đoạn mạch cần cắt ra
# Đếm số lần xuất hiện của đoạn mạch x trong chuỗi ARN
count = s.count(x)
# In ra kết quả
with open("BAI2.OUT", "w") as f_out:
f_out.write(str(count))
Cài đặt Câu 2 bằng ngôn ngữ lập trình C++
#include <iostream>
#include <string>
using namespace std;
int main() {
freopen("BAI2.INP", "r", stdin); // Đọc từ file BAI2.INP
freopen("BAI2.OUT", "w", stdout); // Ghi vào file BAI2.OUT
// Đọc dữ liệu từ stdin (đã được redirect từ file BAI2.INP)
string s, x;
cin >> s >> x;
// Đếm số lần xuất hiện của đoạn mạch x trong chuỗi ARN
int count = 0;
size_t pos = s.find(x);
while (pos != string::npos) {
count++;
pos = s.find(x, pos + 1);
}
// Ghi kết quả vào stdout (đã được redirect vào file BAI2.OUT)
cout << count << endl;
return 0;
}
Đáp án Câu 3. Thử tài nhanh trí
Đây là một bài toán phân tích số thành tích các thừa số nguyên tố và tính tổng các số mũ x1 có giá trị lẻ. Cuối cùng, ta cần tính giá trị của s và p dựa trên các thông số đã cho.
Để giải quyết bài toán này, ta có thể sử dụng thuật toán phân tích số thành tích các thừa số nguyên tố, sau đó tính toán giá trị của s và p bằng cách duyệt qua các thừa số nguyên tố và số mũ tương ứng của chúng.
Cài đặt Câu 3 bằng ngôn ngữ lập trình Python
def prime_factors(n):
factors = []
while n % 2 == 0:
factors.append(2)
n //= 2
for i in range(3, int(n**0.5) + 1, 2):
while n % i == 0:
factors.append(i)
n //= i
if n > 2:
factors.append(n)
return factors
# Đọc số tự nhiên n từ file BAI3.INP
with open("BAI3.INP", "r") as f:
n = int(f.readline().strip())
# Phân tích n thành tích các thừa số nguyên tố
factors = prime_factors(n)
# Tính giá trị của s và p
s = sum(x for x in factors if x % 2 == 1)
p = sum(factors)
# Ghi kết quả vào file BAI3.OUT
with open("BAI3.OUT", "w") as f:
f.write(str(s) + "\n")
f.write(str(p) + "\n")
Cài đặt Câu 3 bằng ngôn ngữ lập trình C++
#include <iostream>
#include <vector>
using namespace std;
// Hàm phân tích số tự nhiên n thành tích các thừa số nguyên tố
vector<int> prime_factors(int n) {
vector<int> factors;
while (n % 2 == 0) {
factors.push_back(2);
n /= 2;
}
for (int i = 3; i * i <= n; i += 2) {
while (n % i == 0) {
factors.push_back(i);
n /= i;
}
}
if (n > 2) {
factors.push_back(n);
}
return factors;
}
int main() {
freopen("BAI3.INP", "r", stdin); // Đọc từ file BAI3.INP
freopen("BAI3.OUT", "w", stdout); // Ghi vào file BAI3.OUT
// Đọc số tự nhiên n từ stdin (đã được redirect từ file BAI3.INP)
int n;
cin >> n;
// Phân tích n thành tích các thừa số nguyên tố
vector<int> factors = prime_factors(n);
// Tính giá trị của s và p
int s = 0, p = 0;
for (int x : factors) {
s += (x % 2 == 1) ? x : 0;
p += x;
}
// Ghi kết quả vào stdout (đã được redirect vào file BAI3.OUT)
cout << s << "\n" << p << "\n";
return 0;
}
code c++ b2 ngay test đầu chạy đã sai
code c++ b1 cũng sai nốt :))
c++ b1 cũng sai nốt :))
Đã xử lý rồi nhé. Thanh Lam