Dưới đây là đề thi và đáp án của kỳ thi chọn học sinh giỏi thành phố Yên Bái năm học 2024 – 2025 môn Tin học dành cho học sinh lớp 9. Các học sinh từ lớp 7 trở lên có quyền tham gia….
ĐỀ THI
Câu 1. Số Pazada (6,0 điểm)
Hùng là một học sinh rất đam về về lịch sử, khi nghiên cứu về văn hóa của người Amazon Hùng thấy. Theo quan niệm của người Amazon số Pazada là số mà các chữ số của nó có giá trị tăng dần như số 123; 367; 689. Hùng muốn kiểm tra trong quyển sách viết về các con số của người Amazon có bao nhiêu số Pazada em hãy giúp bạn hùng thực hiện công việc đó
Dữ liệu vào: Từ file văn bản PAZADA.INP gồm:
- Dòng thứ nhất chứa duy nhất số nguyên dương N (N ≤ 105).
- Dòng thứ hai lần lượt chứa N số a1, a2,…, aN là các số nguyên dương có trong dãy (0 < ai ≤ 109).
Kết quả: Ghi ra file văn bản PAZADA.OUT
Ví dụ:
PAZADA.INP | PAZADA.OUT |
6 3127 54 689 5843 868 246 | 689 246 |
PAZADA.INP | PAZADA.OUT |
4 54 321 997 777 | -1 |
Ràng buộc:
- Có 60% test tương ứng 60% số điểm của bài với N ≤ 103;
- Có 40% test tương ứng 40% số điểm của bài với N ≤ 105;
Câu 2. Đếm số nguyên tố (6,0 điểm) Cho một dãy gồm n số nguyên dương A[i] (1 ≤ i ≤ n). Hãy đếm xem có bao nhiêu số nguyên tố trên dãy A.
Dữ liệu vào: Trong tệp DEMNGTO.INP gồm:
- Dòng 1 chứa số n (1 < n < 105).
- Dòng 2 gồm n số nguyên dương A[i] (1 < A[i] ≤ 105). Các số trên một dòng cách nhau bởi dấu cách.
Kết quả: ghi ra tệp demngto.out gồm: 1 số là số các số nguyên tố đếm được Ví dụ :
DEMNGTO.INP | DEMNGTO.OUT |
12 12 13 8 9 17 15 2 4 10 11 21 19 | 5 |
Ràng buộc:
(1) Có 50% số test tương ứng với 50% số điểm thỏa mãn: n ≤ 102 , A[i] ≤ 103
(2) Có 40% số test khác tương ứng với 40% số điểm thỏa mãn: n ≤ 104 , A[i] ≤ 103
(3) Có 10% số test khác tương ứng với 10% số điểm thỏa mãn: n ≤ 105 , A[i] ≤ 105
Câu 3. Con đường đẹp (4,0 điểm) Trong lễ hội mùa xuân của thành phố, các con đường trong thành phố Alpha được trang trí bằng dãy đèn nhiều màu sắc. Mỗi bóng đèn được ký hiệu bằng một chữ cái Latinh hoa đại diện cho màu sắc của bóng đèn đó. Một đoạn đèn được gọi là nổi bật nếu tất cả bóng đèn trên đoạn đó có cùng màu và được treo liên tiếp trên một con đường.
Yêu cầu: Hãy tìm đoạn đèn nổi bật dài nhất trên tất cả các con đường của thành phố Alpha.
Dữ liệu: cho trong file DUONGDEP.INP gồm:
- Dòng 1 ghi số nguyên dường là số con đường trong thành phố Alpha.
- dòng tiếp theo, dòng thứ ghi một xâu kí tự gồm các chữ cái latinh hoa, mô tả màu sắc của các bóng đèn được treo liên tiếp từ đầu con đường đến cuối con đường thứ . Số lượng đèn trên mỗi con đường không lớn hơn .
Kết quả: Ghi ra file DUONGDEP.OUT một số nguyên là số lượng đèn trên đoạn đường nổi bật có nhiều đèn cùng màu nhất trong các con đường của thành phố. Ví dụ:
DUONGDEP.INP | DUONGDEP.OUT | Giải thích |
3 RGGGGBPRR YYYRRRRBBBB GBRPYYYYYYCCC | 6 | Đoạn đường nổi bật nhất gồm 6 đèn màu Y (YYYYYY) liên tiếp ở con đường thứ 3. |
Giới hạn:
Subtask 1: Có 80% test tương ứng với và số cây xanh trên mỗi con đường không quá 100 cây.
Subtask 2: Có 20% số test không có giới hạn gì thêm.
Câu 4. Tổng nhỏ nhất (4,0 điểm) Tập đoàn Alpha có hai chi nhánh kinh doanh trong năm nay. Tập đoàn thực hiện thống kê doanh thu của cả hai chi nhánh trong thời điểm. Chi nhánh A có lợi nhuận tại thời điểm thứ là , chi nhánh B có lợi nhuận tại thời điểm thứ là (). Lợi nhuận có thể âm nếu tại thời điểm thống kê chi nhánh đang lỗ. Để đánh giá khả năng cân bằng doanh thu giữa hai chi nhánh, tập đoàn cần tìm ra doanh thu tại thời điểm ở chi nhánh A và tại thời điểm ở chi nhánh B sao cho tổng doanh thu | là nhỏ nhất.
Yêu cầu: Hãy tìm tổng doanh thu | nhỏ nhất. Dữ liệu: Vào từ file văn bản TONGMIN.INP
- Dòng 1: Số nguyên dương .
- Dòng 2: Ghisố nguyên dương .
- Dòng 3: Ghisố nguyên dương .
Kết quả: Ghi ra file văn bản TONGMIN.OUT một số nguyên duy nhất là kết quả tìm được. Ví dụ:
TONGMIN.INP | TONGMIN.OUT | Giải thích |
5 2 1 7 -6 5 3 3 8 9 10 | 2 | Cặp doanh thu có tổng nhỏ nhất là và |
Giới hạn:
Subtask 1: có 60% test với n <= 103.
Subtask 2: có 40% test với 103 < n <= 106.
HƯỚNG DẪN GIẢI
Câu 1. Số Pazada (6,0 điểm)
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
bool isPazada(int number) {
int prev_digit = 10; // Số lớn hơn bất kỳ chữ số nào (0-9)
while (number > 0) {
int current_digit = number % 10;
if (current_digit >= prev_digit) {
return false;
}
prev_digit = current_digit;
number /= 10;
}
return true;
}
int main() {
freopen("PAZADA.INP", "r", stdin);
freopen("PAZADA.OUT", "w", stdout);
int N;
cin >> N;
vector<int> numbers(N);
for (int i = 0; i < N; ++i) {
cin >> numbers[i];
}
vector<int> pazadaNumbers;
for (int number : numbers) {
if (isPazada(number)) {
pazadaNumbers.push_back(number);
}
}
for (int number : pazadaNumbers) {
cout << number << " ";
}
cout << endl;
return 0;
}
Câu 2. Đếm số nguyên tố (6,0 điểm)
#include <bits/stdc++.h>
using namespace std;
// Hàm kiểm tra một số có phải là số nguyên tố hay không
bool isPrime(int num) {
if (num < 2) return false;
for (int i = 2; i * i <= num; ++i) {
if (num % i == 0) return false;
}
return true;
}
int main() {
freopen("DEMNGTO.INP", "r", stdin); // Mở file đầu vào
freopen("DEMNGTO.OUT", "w", stdout); // Mở file đầu ra
int n;
cin >> n; // Đọc số lượng phần tử trong dãy
int count = 0; // Biến đếm số nguyên tố
for (int i = 0; i < n; ++i) {
int num;
cin >> num;
if (isPrime(num)) {
++count;
}
}
cout << count << endl; // Ghi kết quả ra file DEMNGTO.OUT
return 0;
}
Câu 3. Con đường đẹp (4,0 điểm)
#include <bits/stdc++.h>
#define N 10000
using namespace std;
int f[N+5];
int n, ans;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
freopen("DUONGDEP.inp", "r", stdin);
freopen("DUONGDEP.out", "w", stdout);
cin >> n;
for (int x=1; x <= n; x++)
{
string s;
cin >> s;
s = " " + s;
memset(f, 0, sizeof(f));
f[1] = 1;
for ( int i = 1; i < s.size(); i++)
{
if (s[i-1] == s[i])
f[i] = f[i-1] + 1;
else f[i] = 1;
ans = max(ans, f[i]);
}
}
cout << ans;
return 0;
}
Câu 4. Tổng nhỏ nhất(4,0 điểm)
#include <bits/stdc++.h>
#define N int(1e6)
using namespace std;
int a[N+5], b[N+5];
int n, ans = 2e9;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
freopen("TONGMIN.inp", "r", stdin);
freopen("TONGMIN.out", "w", stdout);
cin >> n;
for (int i=1; i <= n; i++) cin >> a[i];
for (int i=1; i <= n; i++) cin >> b[i];
sort (a+1, a+n+1);
sort (b+1, b+n+1);
int l = 1, r = n;
while (l <= n && r >= 1)
{
ans = min(ans, abs(a[l]+b[r]));
if (ans == 0) break;
if (a[l] + b[r] < 0) l++;
else r--;
}
cout << ans;
return 0;
}