Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án)
Bạn đang xem 30 trang mẫu của tài liệu "Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án)", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
Tóm tắt nội dung tài liệu: Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án)

Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án) - De-Thi.com ĐỀ SỐ 3 SỞ GIÁO DỤC VÀ ĐÀO TẠO HÀ KỲ THI CHỌN HỌC SINH GIỎI LỚP 9 CẤP NỘI THÀNH PHỐ - NĂM HỌC 2022-2023 ĐỀ CHÍNH THỨC Môn: TIN HỌC (Đề thi gồm 03 trang) Thời gian: 150 phút (không kể thời gian giao đề) TỔNG QUAN ĐỀ THI Tên tệp Tên tệp Tên tệp STT Tên bài Điểm chương trình dữ liệu vào kết quả ra 1 Thời gian TG.* TG.INP TG.OUT 5 2 Mật mã MM.* MM.INP MM.OUT 5 3 Trạm phát sóng TPS.* TPS.INP TPS.OUT 4 4 Triễn lãm TL. TL.INP TL.OUT 3 5 Dãy đẹp DD.* DD.INP DD.OUT 3 Chú ý: Dấu * được thay thế bởi PAS, CPP, PY của ngôn ngữ lập trình được sử dụng tương ứng là Pascal, C/C++ hoặc Python. Bài I (5,0 điểm). Thời gian Trung tâm lái xe tổ chức một đợt sát hạch vào lúc 8 giờ 00 phút sáng. Thời gian thực hiện bài sát hạch tối đa là 100 phút. Đợt sát hạch gồm N thí sinh được đánh số từ 1 đến N. Thí sinh thứ i hoàn thành bài sát hạch trong Ti phút (1 ≤ i ≤ N). Yêu cầu: Hãy lập trình đưa ra thời điểm kết thúc bài sát hạch của mỗi thí sinh giúp trung tâm. Dữ liệu vào từ tệp văn bản TG.INP: - Dòng đầu tiên chứa một số nguyên N là số lượng thí sinh (1 ≤ N ≤ 20). - Dòng thứ i trong N dòng tiếp theo chứa một số nguyên Ti là thời gian hoàn thành bài sát hạch của thi sinh thứ i (0 < Ti ≤ 100, 1 ≤ i ≤ N). Kết quả ghi ra tệp văn bàn TG.OUT: Gồm N dòng, mỗi dòng là thời điểm bài sát hạch kết thúc của từng thí sinh có cấu trúc giờ:phút (không chứa dấu cách). Nếu giờ và phút nhỏ hơn 10 thì ghi thêm một chữ số 0 trên đầu (ví dụ: 8 giờ 5 phút viết là 08:05). Ví du: TG.INP TG.OUT 3 08:05 5 08:10 10 09:05 65 De-Thi.com Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án) - De-Thi.com Bài II (5,0 điểm). Mật mã Một mật thư chứa mật mã bí ẩn được tạo ra là một xâu kí tự chỉ gồm các chữ số và các kí tự in thường. Mật mã bí ẩn là số lượng các số nguyên phân biệt xuất hiện trong thư. Ví dụ: Với mật thư as 00023 dkrf23smk1asd23sam09aa9 chứa 3 số nguyên phân biệt 23, 1, 9. Nên mật mã là 3. Yêu cầu: Hãy lập trình đưa ra mật mã bí ẩn. Dữ liệu vào từ tệp văn bản MM.INP: Một xâu (độ dài xâu ≤ 100) gồm các chữ số và các kí tự in thường. Tất cả các số nguyên trong xâu có nhiều nhất 3 chữ số. Kết quả ghi ra tệp văn bản MM.OUT: Một số nguyên duy nhất là kết quả của bài toán. Ví dụ: MM.INP MM.OUT abc123abc2a3a1 4 as00023dkrf23smk1asd23sam09aa9 3 Bài III (4,0 điểm). Trạm phát sóng Các trạm thu, phát sóng viễn thông của thành phố được đặt trên một đường tròn. Đường tròn này được chia thành 106 điểm cách đều nhau theo chiều kim đồng hồ. Một vị trí trên đường tròn được chọn là mốc 0. Có N trạm thu sóng được đánh thứ tự từ 1 đến N, trạm thứ i đạt ở vị trí ai (1 ≤ i ≤ N) Thành phố dự kiến sẽ đầu tư K trạm phát sóng với phạm vi phát như nhau. Tuy nhiên, một trạm phát sóng với phạm vi phát càng dài thì chi phí càng cao. Vì vậy, thành phố cần tính toán để đầu tư các trạm phát sóng có phạm vi phát ngắn nhất và phải đảm bảo các trạm thu sóng đều nhận được tín hiệu. Khi một trạm phát sóng có phạm vi phát là R thì các trạm thu sóng trong khoảng cách R theo cả hai chiều kim đồng hồ đều nhận được tín hiệu. Ví dụ: Trạm phát sóng tại vị trí 3 với phạm vi phát 1 thì cả trạm thu sóng ở vị trí 2 và 4 đều nhận được tín hiệu. Yêu cầu: Tìm phạm vi phát ngắn nhất của K trạm phát sóng sẽ đầu tư để N trạm thu sóng đều nhận dược tín hiệu. Dữ liệu vào từ từ tệp văn bản TPS.INP: - Dòng đầu tiên chứa số nguyên dương N (1 ≤ N ≤ 103). - Dòng thứ i trong N dòng tiếp theo chứa một số nguyên ai là vị trí trạm thu sóng thứ i. 6 Không có hai trạm nào cùng vị trí (0 ≤ ai ≤10 , 1 ≤ i ≤ N). - Dòng cuối cùng chứa số nguyên K là số trạm phát sóng (1 ≤ K ≤ N). Chú ý, vị trí trạm phát có thể được đặt cùng vị trí của một trạm thu nào đó. Kết quả ghi ra tệp văn bản TPS.OUT: Số nguyên duy nhất là phạm vi phát sóng ngắn nhất của K trạm phát. De-Thi.com Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án) - De-Thi.com Ví dụ: TPS.INP TPS.OUT Giải thích 4 498 Đặt một trạm phát sóng ở vị trí 503 và một trạm 5 phát sóng ở vị trí 12340 có phạm vi phát sóng là 1000 498. 12345 987 2 2 1 Đặt một trạm phát sóng ở vị trí 0 có phạm vi phát 1 sóng là 1. 999999 1 Bài IV (3,0 điểm). Triển lãm Bảo tàng thành phố có N bức tranh được đánh số thứ tự từ 1 đến N. Bức tranh thứ i có kích thước là Ai và được định giá là Bi (1 ≤ i ≤ N) Giám đốc bảo tàng muốn chọn một số bức tranh trưng bày trong buổi triển lãm để thu được lợi nhuận lớn nhất thỏa mãn các tiêu chí: - Phải trưng bày ít nhất một bức tranh. - Chênh lệch về kích thước giữa các bức tranh được trưng bày càng nhỏ càng tốt. - Tổng giá trị các bức tranh được trưng bày là lớn nhất. Gọi Amin là kích thước nhỏ nhất, Amax là kích thước lớn nhất, S là tổng giá trị của các bức tranh được lựa chọn trưng bày. Lợi nhuận của bảo tàng được tính theo công thức H = S – (Amax – Amin) Yêu cầu: Hãy giúp Giám đốc bảo tàng tìm H lớn nhất? Dữ liệu vào từ tệp văn bản TL.INP: - Dòng đầu tiên chứa số nguyên N là số lượng các bức tranh (2 ≤ N ≤ 500000). - Dòng thứ i trong N dòng tiếp theo chứa hai số nguyên Ai và Bi là kích thước và định giá của 15 9 bức tranh thứ i (1 ≤ Ai ≤ 10 , 1 ≤ Bi ≤ 10 , 1 ≤ i ≤ N). Kết quả ghi ra tệp văn bản TL.OUT: Số nguyên H lớn nhất tìm được. Ràng buộc: - Có 25% số test tương ứng 25% số điểm có n ≤ 16. - 25% số test tương ứng 25% số điểm có n ≤ 300. - 25% số test tương ứng 25% số điểm có n ≤ 5000. - 25% số test còn lại tương ứng 25% số điểm không có ràng buộc gì thêm. De-Thi.com Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án) - De-Thi.com Ví dụ: TL. INP TL. OUT Giải thích 3 6 Chọn các bức tranh là 1 và 3 thì: 2 3 H = (3 + 5) – (4 – 2) = 6 là lớn nhất 9 2 4 5 Bài V (3,0 điểm). Dãy đẹp Trong giờ số học, cô giáo đưa ra dãy A gồm N số nguyên dương từ 1 đến N. Cô cho mỗi học sinh chọn một dãy con B gồm các phần tử liên tiếp của A. Dãy con B đươc gọi là dãy đẹp nếu ta sấp xếp B theo thứ tự tăng dần thì được một dãy số nguyên liên tiếp. Dãy con chỉ gồm một phần tử cũng được gọi là dãy đẹp. Ví dụ, B = {2, 4, 3} là dãy đẹp trong khi B = {2,3,2} thì không. Yêu cầu: Hãy giúp cả lớp đếm số lượng dãy con đẹp của A theo yêu cầu của cô giáo. Dữ liệu vào từ tệp văn bản DD.INP: - Dòng đầu tiên là số nguyên dương N (1 ≤ N ≤ 105). - Dòng thứ hai chứa N số nguyên dương A1, A2, , AN (1 ≤ Ai ≤ N, 1 ≤ i ≤ N). Kết quả ghi ra tệp văn bản DD.OUT: Một số nguyên duy nhất là số lượng dãy con đẹp của A. Ràng buộc: - Có 30% số test tương ứng 30% số điểm có N ≤ 200. - 30% số test tương ứng 30% số điểm có N ≤ 2000 và các phần tử của A đôi một phân biệt. - 20% số test tương ứng 20% số điểm có N ≤ 105 và các phần tử của A đôi một phân biệt. - 20% số test còn lại tương ứng 20% số điểm không có ràng buộc gì thêm. Ví dụ: DD. INP DD. OUT Giải thích 3 6 Có 6 con dãy đẹp là: 1 2 3 {1}, {2}, {3}, {1,2}, {2,3}, {1,2,3}, 3 4 Có 4 con dãy đẹp là: 2 2 1 {2}, {2},{1}, {2,1} ----------HẾT---------- De-Thi.com Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án) - De-Thi.com ĐÁP ÁN Bài I (5,0 điểm). Thời gian #include // For input/output operations #include // Not strictly needed for this problem, but useful for arrays #include // For std::setw and std::setfill to format output int main() { // Tối ưu hóa I/O trong C++ để chương trình chạy nhanh hơn std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); int N; // Số lượng thí sinh std::cin >> N; // Thời gian bắt đầu sát hạch: 8 giờ 00 phút int start_hour = 8; int start_minute = 0; for (int i = 0; i < N; ++i) { int Ti; // Thời gian hoàn thành của thí sinh thứ i std::cin >> Ti; // Tính tổng số phút từ 00:00 của ngày bắt đầu int total_minutes_at_start = start_hour * 60 + start_minute; // Tính tổng số phút tại thời điểm kết thúc int total_minutes_at_end = total_minutes_at_start + Ti; // Chuyển tổng số phút về giờ và phút int end_hour = total_minutes_at_end / 60; int end_minute = total_minutes_at_end % 60; // In kết quả theo định dạng HH:MM // std::setw(2) đảm bảo in ra 2 ký tự, std::setfill('0') điền ký tự '0' nếu thiếu std::cout << std::setw(2) << std::setfill('0') << end_hour << ":" << std::setw(2) << std::setfill('0') << end_minute << std::endl; } De-Thi.com Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án) - De-Thi.com return 0; } Bài II (5,0 điểm). Mật mã #include // For input/output operations #include // For std::string #include // For std::set to store unique numbers #include // Not strictly needed, but useful generally int main() { // Optimize C++ standard streams for faster input/output. std::ios_base::sync_with_stdio(false); std::cin.tie(NULL); std::string s; // Chuỗi đầu vào std::cin >> s; std::set distinct_positive_numbers; // Tập hợp để lưu các số nguyên dương phân biệt std::string current_number_str; // Chuỗi tạm để xây dựng số hiện tại // Duyệt qua từng ký tự trong chuỗi for (char c : s) { if (isdigit(c)) { // Nếu ký tự là một chữ số current_number_str += c; } else { // Nếu ký tự không phải là chữ số hoặc đã đến cuối chuỗi if (!current_number_str.empty()) { // Nếu có một chuỗi số đang chờ xử lý int num = std::stoi(current_number_str); // Chuyển chuỗi số thành số nguyên if (num > 0) { // Nếu số nguyên là dương distinct_positive_numbers.insert(num); // Thêm vào tập hợp } current_number_str.clear(); // Xóa chuỗi tạm để chuẩn bị cho số tiếp theo } } } // Xử lý số cuối cùng trong chuỗi (nếu chuỗi kết thúc bằng chữ số) if (!current_number_str.empty()) { De-Thi.com Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án) - De-Thi.com int num = std::stoi(current_number_str); if (num > 0) { distinct_positive_numbers.insert(num); } } // In kích thước của tập hợp (số lượng số nguyên dương phân biệt) std::cout << distinct_positive_numbers.size() << std::endl; return 0; } Bài III (4,0 điểm). Trạm phát sóng #include // Cung cấp cin, cout cho nhập xuất #include // Cung cấp cấu trúc dữ liệu vector #include // Cung cấp các hàm sort và unique #include // Có thể dùng để loại bỏ trùng lặp dễ dàng hơn, nhưng unique trên vector đã sắp xếp là hiệu quả. using namespace std; // Sử dụng namespace std để không phải gõ std:: // Hàm kiểm tra xem với bán kính R cho trước, có thể phủ tất cả các trạm không // Main station at 0 degrees, K auxiliary stations bool check(int R, const vector & initial_locations, int K) { // Nếu R quá lớn (>= 180 độ), một trạm có thể phủ toàn bộ đường tròn. // Trong trường hợp này, mọi trạm đều được phủ, không cần trạm phụ. if (R >= 180) { return true; } // Chuẩn hóa vị trí các trạm về phạm vi [0, 359] và loại bỏ các vị trí trùng lặp. vector locations_mod; for (int loc : initial_locations) { locations_mod.push_back(loc % 360); // Chuẩn hóa về 0-359 độ } sort(locations_mod.begin(), locations_mod.end()); // Sắp xếp để dễ dàng xử lý và loại bỏ trùng lặp locations_mod.erase(unique(locations_mod.begin(), locations_mod.end()), De-Thi.com Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án) - De-Thi.com locations_mod.end()); // Loại bỏ trùng lặp // Nếu không có trạm nào cần phủ (danh sách rỗng sau khi loại bỏ trùng lặp), thì đã phủ được. if (locations_mod.empty()) { return true; } // Xác định các điểm KHÔNG được phủ bởi trạm chính (tại 0 độ, bán kính R). // Trạm chính phủ các góc trong [0, R] và [360 - R, 359]. vector uncovered_points; for (int p : locations_mod) { if (!(p = 360 - R)) { // Nếu p KHÔNG nằm trong phạm vi phủ của trạm chính uncovered_points.push_back(p); } } // Nếu tất cả các điểm đã được phủ bởi trạm chính, không cần trạm phụ. if (uncovered_points.empty()) { return true; } // Áp dụng thuật toán tham lam để phủ các điểm còn lại bằng K trạm phụ. // Các điểm trong 'uncovered_points' đã được sắp xếp và nằm trong một đoạn thẳng // (từ R+1 đến 360-R-1), không có vấn đề vòng tròn ở đây. int current_aux_stations_needed = 0; int last_covered_angle = -1; // Góc xa nhất đã được phủ bởi trạm phụ trước đó for (int p : uncovered_points) { if (p > last_covered_angle) { // Điểm 'p' chưa được phủ bởi trạm phụ gần nhất, cần đặt một trạm phụ mới. current_aux_stations_needed++; // Trạm phụ đặt để phủ 'p' sẽ phủ một cung dài 2*R. // Để tối ưu, nó sẽ phủ từ 'p' đến 'p + 2*R'. last_covered_angle = p + 2 * R; } } De-Thi.com Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án) - De-Thi.com // Trả về true nếu số trạm phụ cần dùng không vượt quá K. return current_aux_stations_needed <= K; } int main() { // Tối ưu hóa nhập xuất ios_base::sync_with_stdio(false); cin.tie(NULL); int N; // Số lượng trạm thu sóng cin >> N; vector A(N); // Vị trí của các trạm thu sóng for (int i = 0; i < N; ++i) { cin >> A[i]; } int K; // Số lượng trạm phát sóng phụ cin >> K; // Tìm kiếm nhị phân cho R int low = 0; // Giá trị R có thể lên tới 360 (hoặc lớn hơn nếu theo ví dụ 498). // Nếu N=1, A=[179], K=0, cần R=179. // Nếu N=2, A=[0, 180], K=0, cần R=180. // Để bao phủ trường hợp ví dụ 498, high phải ít nhất là 498. // Để an toàn, có thể dùng một giới hạn trên lớn hơn hẳn, ví dụ 1000. // Bởi vì, nếu các trạm thu sóng rất gần nhau và trải đều, thì R nhỏ. // Nhưng nếu chỉ có 2 trạm ở 1 độ và 359 độ, và K=0, thì R=1 sẽ phủ được (hoặc 359). // Nếu có 2 trạm ở 100 và 101, và K=0, R cần 101. // Với K trạm phụ, nó có thể kéo giãn R. // Dựa vào ví dụ 498, R có thể vượt quá 360. // Max R có thể là: khoảng cách lớn nhất giữa 2 điểm (ví dụ 180) cộng thêm K lần 2R. // Một upper bound an toàn hơn: 360 * N (nếu mỗi trạm cách nhau 360 độ). // Nhưng R chỉ là bán kính của một trạm. Max R có thể là 360. // Vấn đề 498 có thể do một sai lệch trong đơn vị hoặc yêu cầu. // Nếu 498 là đáp án hợp lệ, R có thể là 498. De-Thi.com Tài liệu luyện thi HSG Tin học Lớp 9 TP.Hà Nội (15 Đề Kèm đáp án) - De-Thi.com // Tôi sẽ đặt high là 500 để bao gồm 498. int high = 500; // Giới hạn trên cho R. int ans = high; // Biến lưu trữ kết quả cuối cùng while (low <= high) { int mid = low + (high - low) / 2; // Tính giá trị giữa để thử if (check(mid, A, K)) { ans = mid; // mid là một R khả thi, thử tìm R nhỏ hơn high = mid - 1; } else { low = mid + 1; // mid quá nhỏ, cần R lớn hơn } } cout << ans << endl; // In ra phạm vi ngắn nhất tìm được return 0; } Bài IV (3,0 điểm). Triển lãm #include // Cung cấp cin, cout #include // Cung cấp vector #include // Cung cấp sort và max #include // Cung cấp deque using namespace std; // Cấu trúc để lưu thông tin về mỗi bức tranh struct Picture { int A; // Kích thước int B; // Giá trị }; // Hàm so sánh để sắp xếp các bức tranh theo kích thước A tăng dần bool comparePictures(const Picture& p1, const Picture& p2) { return p1.A < p2.A; } De-Thi.com
File đính kèm:
tai_lieu_luyen_thi_hsg_tin_hoc_lop_9_tp_ha_noi_15_de_kem_dap.docx