CÁC CHUYÊN ĐỀ TIN HỌC ĐẠT GIẢI TẠI HỘI THẢO KHOA HỌC CÁC TRƯỜNG CHUYÊN KHU VỰC DUYÊN HẢI VÀ ĐỒNG BẰNG BẮC BỘ NĂM 2022 Giải Nhất: Chuyên đề Kỹ thuật Sweep Line, tác giả Nguyen Nhu Thang, trường THPT Chuyên Lào Cai, Lào Cai. (Từ trang 3 đến trang 53). Giải Nhì: Chuyên đề Cây trie – cây tiền tố, tác giải Le Van Dong, trường THPT Chuyên Lê Thánh Tông, Quảng Nam. (Từ trang 54 đến trang 96). Giải Nhì: Chuyên đề Bài toán luồng cực đại Thuật toán Ford – Fulkerson và những cải tiến, tác giả Pham Trong Khiem, trường THPT Chuyên Hoàng Lê Kha, Tây Ninh. (Từ trang 97 đến trang 181). Giải Ba: Chuyên đề Cây tiền tố Trie, tác giả Bui Thu Huong, trường THPT Chuyên Biên Hòa, Hà Nam (Từ trang 182 đến trang 223). Giải Ba: Chuyên đề Quy hoạch động, tác giả Vuong Nu Vi Linh, trường THPT Chuyên Chu Văn An, Bình Định. (Từ trang 224 đến trang 260). Giải Ba: Chuyên đề Bài toán tìm đường đi ngắn nhất trên Đồ thị lưới, tác giả Do Van Nho, trường THPT Chuyên Lê Quý Đôn, Đà Nẵng. (Từ trang 261 đến hết).
CÁC CHUYÊN ĐỀ TIN HỌC ĐẠT GIẢI TẠI HỘI THẢO KHOA HỌC CÁC TRƯỜNG CHUYÊN KHU VỰC DUYÊN HẢI VÀ ĐỒNG BẰNG BẮC BỘ NĂM 2022 Giải Nhất: Chuyên đề Kỹ thuật Sweep Line, tác giả Nguyen Nhu Thang, trường THPT Chuyên Lào Cai, Lào Cai (Từ trang đến trang 53) Giải Nhì: Chuyên đề Cây trie – tiền tố, tác giải Le Van Dong, trường THPT Chuyên Lê Thánh Tông, Quảng Nam (Từ trang 54 đến trang 96) Giải Nhì: Chun đề Bài tốn luồng cực đại Thuật toán Ford – Fulkerson cải tiến, tác giả Pham Trong Khiem, trường THPT Chuyên Hoàng Lê Kha, Tây Ninh (Từ trang 97 đến trang 181) Giải Ba: Chuyên đề Cây tiền tố - Trie, tác giả Bui Thu Huong, trường THPT Chuyên Biên Hòa, Hà Nam (Từ trang 182 đến trang 223) Giải Ba: Chuyên đề Quy hoạch động, tác giả Vuong Nu Vi Linh, trường THPT Chuyên Chu Văn An, Bình Định (Từ trang 224 đến trang 260) Giải Ba: Chun đề Bài tốn tìm đường ngắn Đồ thị lưới, tác giả Do Van Nho, trường THPT Chuyên Lê Quý Đôn, Đà Nẵng (Từ trang 261 đến hết) SWEEP LINE MỞ ĐẦU Qua số năm dạy HSG môn Tin học, tơi nhận thấy để học sinh có đam mê mơn học người thầy cần có tâm với nghề, có lực chun mơn tốt, có kĩ sư phạm, bên cạnh việc giáo viên ln tìm để kích thích sáng tạo học sinh điều quan trọng Học sinh có đam mê, có sáng tạo chắn gặt hái nhiều thành công, không học tập mà cịn thành cơng sống sau Trong q trình giảng dạy tơi thấy có chủ đề Sweep line thú vị, tìm kiếm tài liệu tiếng Việt hiếm, nên chuyên đề xin chia sẻ số nội dung sweep line mà dạy cho học sinh Một hình ảnh thú vị bạn quét sân hình chữ nhật (sân nhà, sân trường) bạn có cách quét nào, thông thường bạn quét ngang qt dọc theo đường thẳng Dựa mơ hình đó, ta có phương pháp xử lí cách làm sweep line số toán Tin học Kĩ thuật sweep line sử dụng tốn hình học tốn mơ hình hố cách quy tốn hình học Khi tốn giải sweep line học sinh qt ngang dọc, xi ngược,…đều Nó phụ thuộc chủ yếu cách mơ hình hố tốn xử lí kiện gặp phải qt qua Một tốn có nhiều cách giải khác Trong trình cho học sinh làm bài, có nhiều hướng giải khác mà học sinh đưa Đó điều tơi mong muốn học sinh Có số tốn quen thuộc, nhìn theo cách sweep line việc xử lí khoa học, dễ hiểu, đưa lời giải hay Việc đánh giá độ phức tạp thuật toán chuyên đề đánh giá thời gian, nhớ chưa quan trọng nên không xem xét Do kiến thức, kinh nghiệm chưa nhiều, nên chân thành mong thầy góp ý, bổ sung nhiều ý kiến cho tơi để tơi hồn thiện thêm chun đề từ tạo chun để hồn chỉnh hơn, để chia sẻ cho đồng nghiệp học sinh Rất mong thầy đọc chun đề chuyên đề đồng nghiệp khác tương tác hai chiều để hồn thiện Như cách để ghi nhận, đánh giá công sức người viết chuyên đề Cá nhân mong nhận nhiều lời phê bình đồng nghiệp Trân trọng cảm ơn! 2 MỘT SỐ BÀI TỐN VÍ DỤ Nhiều tốn hình học giải cách sử dụng kĩ thuật đường quét (sweep line) Ý tưởng thuật toán biểu diễn đối tượng toán tập kiện tương ứng với điểm mặt phẳng Các kiện xử lý theo thứ tự tăng dần theo tọa độ x y chúng Trong tốn ví dụ, tơi trình bày theo mơ hình lí tưởng Từ học sinh hiểu rõ việc xử lí kiện sau mơ hình hố, ví dụ Sau học sinh phát triển tự xử lí mơ hình khơng chuẩn, cần kết hợp nhiều kĩ thuật phương pháp khác Sweep line có nhiều tài liệu gọi thuật tốn, cá nhân tơi nghĩ nên gọi kĩ thuật hợp lí hơn, gợi ý cho ý tưởng xử lí kiện, xử lí thơng tin tốn theo thứ tự định Các tập phân tích, thiết kế theo nhiều cấp độ, nhiều có kết hợp cấu trúc liệu, thuật toán khác Nên kiến thức để học sinh lĩnh hội hết nội dung chuyên đề rộng Bài tập đưa bao gồm đề bài, phân tích thuật tốn, chương trình minh hoạ (có comment để thể ý tưởng), có test cho Để hình dung rõ kĩ thuật này, vào số ví dụ sau: 2.1 Ví dụ 1: Thời điểm gặp mặt Ta xem xét tốn sau: Có cơng ty có N nhân viên, biết nhân viên có thời gian đến ngày định Nhiệm vụ bạn tính số lượng tối đa nhân viên có văn phịng thời điểm Cho thời điểm khơng q Ví dụ thời gian đến nhân viên cho bảng sau: Nhân viên Thời gian đến Thời gian John 10 15 Maria 12 Peter 14 16 Lisa 13 Ta có giải tự nhiên sau: Để biết thời điểm T bất kì, có nhân viên có mặt cơng ty, cách đơn giản kiểm tra T có nằm đoạn thời gian đến người người cơng ty Việc kiểm tra tất thời điểm thời gian Rõ ràng với cách làm lâu lớn Ta xét mơ hình sử dụng kĩ thuật sweep line sau: Với nhân viên ta biểu diễn quãng thời gian làm việc họ đoạn thẳng mặt phẳng, kiện tương ứng thời điểm đến, thời điểm người, sau: Sau mô hình hố vậy, nhận xét thời điểm T, ta coi đường thẳng đứng quét từ trái sang phải mơ hình Với gặp kiện đến ta tăng số nhân viên lên 1, cịn gặp kiện giảm số nhân viên Còn thời điểm T quét qua đoạn, khơng gặp kiện số nhân viên khơng đổi Từ dẫn đến ta cần xử lí kiện đến đủ Trên hình, đường nét đứt thời gian T để quét xem số người gặp bao nhiêu, ta quét T từ trái sang phải, theo chiều tăng dần thời gian Dễ thấy khoảng thời điểm đến John thời điểm rời Maria số người có mặt cơng ty lớn (3 người) Độ phức tạp thuật toán là thời gian xếp kiện đến tăng dần theo thời gian Thời gian đọc liệu xử lí kiện Rõ ràng cách xử lí hiệu nhiều, khơng cịn phụ thuộc vào Chú ý: Trong trường hợp thời điểm T có kiện đến ta ưu tiên xử lí kiện đến trước Chương trình minh hoạ: #include using namespace std; int n,cnt,res; vector point; int main() { ///meeting cin>>n; for(int i=1; i>in>>out; point.push_back({in,0}); point.push_back({out,1}); } sort(point.begin(),point.end()); for(int i=0; i< point.size(); i++) { ///sweep line if(point [i].second==0) res=max(res,++cnt); else cnt ; } cout>y1>>x2>>y2;///read data input if(y1==y2) { point.push_back({x1,1,y1,0});///begin point.push_back({x2,3,y1,0});///end } if(x1==x2) { point.push_back({x1,2,y1,y2});///Vertical } } sort(point.begin(),point.end(),cmp); for(P a:point) { if(a.t==1) upd(a.y1,1); ///Begin of segment if(a.t==3) upd(a.y1,-1); ///End of segment if(a.t==2) /// Count the intersection res=res+get(a.y2)-get(a.y1-1); } coutx1>>y1>>x2>>y2; P.push_back({x1,y1,0}); P.push_back({x2,y2,1}); } sort(P.begin(),P.end()); int x=0; for(int i=0; i> u >> v; queue q[11]; int ptr = 0; dist[x][y] = 0; q[0].push({x, y}); while (true) { int cycle = ptr; while (q[ptr].empty()) { ptr = (ptr + 1) % 11; if (ptr == cycle) break; } if (q[ptr].empty()) break; Cell cell = q[ptr].front(); q[ptr].pop(); int x = cell.row, y = cell.col; if (x == u && y == v) break; for (int i = 0; i < 4; i++) { int u = x + dx[i], v = y + dy[i], w = c[a[x][y]][a[u][v]]; if (inGrid(u, v) && dist[u][v] > dist[x][y] + w) { dist[u][v] = dist[x][y] + w; q[(ptr + w) % 11].push({u, v}); } 294 } } cout