| # | Bài tập | Điểm | Thời gian: | Giới hạn bộ nhớ |
|---|---|---|---|---|
| 1 | JOI 2014 - Water Bottle | 100 (p) | 5.0s | 512M |
| 2 | JOI 2014 - Making Friends is Fun | 100 (p) | 1.0s | 256M |
| 3 | JOI 2014 - Collecting Stamps | 100 (p) | 1.0s | 256M |
Thành phố IOI, nơi JOI sinh sống, nổi tiếng là rất nóng quanh năm.
Thành phố IOI có dạng hình chữ nhật được chia thành \(H\) hàng và \(W\) cột ô vuông. Mỗi ô là một tòa nhà, một bãi đất trống hoặc một bức tường. Có \(P\) ô là tòa nhà, được đánh số từ \(1\) đến \(P\).
JOI chỉ có thể đi vào các ô là tòa nhà hoặc bãi đất trống. Từ một ô, JOI chỉ có thể đi trực tiếp sang một ô kề cạnh, tức là có chung một cạnh với ô đó. Trong quá trình di chuyển, JOI không được đi ra ngoài thành phố IOI.
JOI cần đi bộ giữa các tòa nhà để giải quyết nhiều công việc khác nhau. Bên trong các tòa nhà có điều hòa, nhưng các bãi đất trống rất nóng vì nắng gắt, nên mỗi lần đi qua một ô đất trống, JOI cần uống \(1\) đơn vị nước. Hơn nữa, các bãi đất trống không có máy bán hàng tự động hay vòi nước uống, nên người dân thành phố IOI thường mang theo bình nước khi di chuyển. Một bình nước có dung tích \(x\) chứa được tối đa \(x\) đơn vị nước. Trong các ô tòa nhà có vòi nước, vì vậy JOI có thể đổ đầy lại bình nước.
Bình nước lớn rất bất tiện khi mang theo, nên JOI muốn dùng bình nhỏ nhất có thể. Với một số chuyến đi giữa các tòa nhà, hãy viết chương trình tìm dung tích bình nước nhỏ nhất mà JOI cần để thực hiện chuyến đi đó.
Cho bản đồ thành phố IOI và \(Q\) câu hỏi. Câu hỏi thứ \(i\) (\(1 \le i \le Q\)) là: “Dung tích bình nước nhỏ nhất cần có để di chuyển giữa tòa nhà \(S_i\) và tòa nhà \(T_i\) là bao nhiêu?”. Hãy viết chương trình trả lời từng câu hỏi.
Đọc dữ liệu từ đầu vào chuẩn theo định dạng sau:
. hoặc #. Ký tự thứ \(c\) (\(1 \le c \le W\)) mô tả ô ở hàng thứ \(r\) từ trên xuống và cột thứ \(c\) từ trái sang. Ký tự . biểu thị tòa nhà hoặc bãi đất trống; ký tự # biểu thị tường...Ghi \(Q\) dòng ra đầu ra chuẩn. Dòng thứ \(i\) (\(1 \le i \le Q\)) chứa một số nguyên là dung tích bình nước nhỏ nhất cần có để di chuyển giữa tòa nhà \(S_i\) và tòa nhà \(T_i\). Nếu không thể di chuyển giữa hai tòa nhà, in -1. Nếu có thể di chuyển mà không đi qua ô đất trống nào, in 0.
Tất cả dữ liệu đầu vào thỏa mãn:
Ví dụ 1
5 5 4 4
.....
..##.
.#...
..#..
.....
1 1
4 2
3 3
2 5
1 2
2 4
1 3
3 4
3
4
4
2
Với dữ liệu này, bản đồ thành phố IOI được thể hiện trong hình dưới đây. Ô có hình vuông màu đen là tường, ô có số là tòa nhà mang số đó, còn ô không có gì là bãi đất trống.
Chẳng hạn, xét việc di chuyển từ tòa nhà \(2\) đến tòa nhà \(4\).
Nếu không đi qua tòa nhà nào khác, đường đi qua các ô được đánh dấu chấm trong hình bên trái đi qua ít ô đất trống nhất và cần bình nước có dung tích \(6\).
Tuy nhiên, nếu đi qua tòa nhà \(1\) như hình bên phải, JOI đi qua \(3\) ô đất trống trên đoạn từ tòa nhà \(2\) đến tòa nhà \(1\), rồi đi qua \(4\) ô đất trống trên đoạn từ tòa nhà \(1\) đến tòa nhà \(4\). Vì vậy, JOI có thể thực hiện chuyến đi với bình nước dung tích \(4\). Không thể thực hiện chuyến đi này bằng bình nước nhỏ hơn.
Ví dụ 2
5 5 3 2
...#.
..#..
#....
.##..
...#.
1 3
5 2
1 5
1 2
1 3
-1
7
Với dữ liệu này, do có tường ngăn cách nên không thể di chuyển giữa tòa nhà \(1\) và tòa nhà \(2\).
Bạn là một điệp viên hoạt động phía sau những sự kiện lịch sử, ngày ngày nỗ lực vì hòa bình thế giới. Thế giới này có \(N\) quốc gia, được đánh số khác nhau từ \(1\) đến \(N\). Mục tiêu của bạn là giúp các quốc gia này xây dựng quan hệ hữu nghị với nhau nhiều nhất có thể. Để lên kế hoạch cho công việc, bạn đã vẽ một sơ đồ thể hiện quan hệ quốc tế hiện tại.
Bạn chuẩn bị một tờ giấy vẽ lớn và trước tiên đánh dấu \(N\) điểm, mỗi điểm biểu thị một quốc gia. Tiếp theo, để thể hiện quan hệ quốc tế hiện tại, bạn vẽ \(M\) mũi tên nối các cặp quốc gia. Mũi tên từ điểm biểu thị quốc gia \(a\) đến điểm biểu thị một quốc gia khác \(b\) có nghĩa là “hiện tại, quốc gia \(a\) đang cử đại sứ đến quốc gia \(b\)”. Từ đây, ta gọi mũi tên từ điểm biểu thị quốc gia \(a\) đến điểm biểu thị quốc gia \(b\) là mũi tên \((a, b)\). Như vậy, \(N\) điểm và \(M\) mũi tên vừa vẽ tạo thành sơ đồ quan hệ quốc tế hiện tại.
Để tạo cơ hội xây dựng quan hệ hữu nghị giữa các quốc gia, ta cân nhắc tổ chức hội nghị ký kết hiệp ước hữu nghị giữa hai quốc gia, sau đây gọi ngắn gọn là “hội nghị”. Để hai quốc gia \(p, q\) có thể tổ chức hội nghị, cần có một quốc gia \(x\) làm trung gian và đang cử đại sứ đến cả hai quốc gia đó. Sau hội nghị, mỗi quốc gia sẽ cử đại sứ đến quốc gia còn lại. Nói cách khác, để quốc gia \(p\) và quốc gia \(q\) tổ chức hội nghị, phải tồn tại quốc gia \(x\) sao cho có cả hai mũi tên \((x, p)\) và \((x, q)\). Sau hội nghị, ta vẽ thêm hai mũi tên \((p, q)\) và \((q, p)\). Tuy nhiên, nếu một mũi tên đã có sẵn thì không vẽ thêm mũi tên đó.
Công việc của bạn là chọn hai quốc gia có thể tổ chức hội nghị cùng với quốc gia làm trung gian, rồi cho họ tổ chức hội nghị. Khi mô phỏng công việc này bằng sơ đồ, bạn quyết định dùng số mũi tên trên giấy làm thước đo mức độ thế giới tiến gần đến hòa bình. Cụ thể, bạn muốn biết số mũi tên lớn nhất có thể có trên giấy sau khi lặp lại thao tác chọn hai quốc gia và cho họ tổ chức hội nghị.
Cho số quốc gia trên thế giới và thông tin về quan hệ quốc tế hiện tại. Hãy viết chương trình tìm số mũi tên lớn nhất có thể có trên giấy bằng cách lặp lại thao tác chọn hai quốc gia và cho họ tổ chức hội nghị.
Đọc dữ liệu từ đầu vào chuẩn theo định dạng sau:
Ghi ra đầu ra chuẩn một dòng chứa số mũi tên lớn nhất có thể đạt được. Lưu ý rằng số này bao gồm cả các mũi tên đã có ban đầu và các mũi tên được vẽ thêm nhờ các hội nghị.
Tất cả dữ liệu đầu vào thỏa mãn:
Ví dụ 1
5 4
1 2
1 3
4 3
4 5
10
Chẳng hạn, có thể tạo được \(10\) mũi tên bằng các bước sau:
Đường sắt IOI có một tuyến đường thẳng gồm \(N + 2\) nhà ga. Các ga trên tuyến được đánh số lần lượt từ \(0\) đến \(N + 1\), bắt đầu từ một đầu tuyến.
Trên tuyến có hai loại tàu: tàu chiều tăng và tàu chiều giảm. Tàu chiều tăng di chuyển theo hướng số hiệu ga tăng dần; tàu chiều giảm di chuyển theo hướng số hiệu ga giảm dần. Đi tàu từ một ga sang ga liền kề mất \(T\) giây. Cụ thể, khi đi tàu chiều tăng, ta có thể đi từ ga \(i\) đến ga \(i + 1\) trong \(T\) giây; khi đi tàu chiều giảm, ta có thể đi từ ga \(i\) đến ga \(i - 1\) trong \(T\) giây. Tuy nhiên, không thể lên tàu chiều tăng tại ga \(N + 1\) hoặc lên tàu chiều giảm tại ga \(0\). Tàu đến rất thường xuyên, nên có thể bỏ qua thời gian chờ tàu.
Mỗi ga có một sân ga dành cho tàu chiều tăng và một sân ga dành cho tàu chiều giảm. Trên lối đi nối hai sân ga có đặt một bàn đóng dấu.
Hiện tại, đường sắt IOI đang tổ chức một hoạt động sưu tập dấu. Để hoàn thành hoạt động này, người tham gia phải xuất phát từ sân ga tàu chiều tăng của ga \(0\), lấy một dấu tại mỗi ga từ \(1\) đến \(N\), rồi đến sân ga tàu chiều tăng của ga \(N + 1\).
Để lấy dấu tại một ga, người tham gia phải xuống tàu rồi đi bộ đến bàn đóng dấu nằm trên lối đi của ga. Thời gian di chuyển giữa sân ga tàu chiều tăng, bàn đóng dấu và sân ga tàu chiều giảm tại ga \(i\) được cho như sau:
Người tham gia chỉ được ghé ga \(0\) và ga \(N + 1\) mỗi ga một lần. Tại các ga từ \(1\) đến \(N\), người tham gia có thể xuống tàu bao nhiêu lần tùy ý.
Cấu trúc ga \(i\).
Cho số ga có dấu cần sưu tập, thời gian đi tàu giữa hai ga liền kề, thời gian di chuyển giữa sân ga tàu chiều tăng và bàn đóng dấu tại mỗi ga, cùng thời gian di chuyển giữa sân ga tàu chiều giảm và bàn đóng dấu tại mỗi ga. Hãy viết chương trình tìm thời gian ít nhất để hoàn thành hoạt động sưu tập dấu.
Thời gian hoàn thành được tính từ lúc xuất phát tại ga \(0\), lấy đủ \(N\) dấu, cho đến khi đến sân ga tàu chiều tăng của ga \(N + 1\). Có thể bỏ qua thời gian chờ tàu ở sân ga và thời gian đóng dấu.
Đọc dữ liệu từ đầu vào chuẩn theo định dạng sau:
| Giá trị | Di chuyển tại ga \(i\) | Thời gian |
|---|---|---|
| \(U_i\) | Từ sân ga tàu chiều tăng đến bàn đóng dấu | \(U_i\) giây |
| \(V_i\) | Từ bàn đóng dấu đến sân ga tàu chiều tăng | \(V_i\) giây |
| \(D_i\) | Từ sân ga tàu chiều giảm đến bàn đóng dấu | \(D_i\) giây |
| \(E_i\) | Từ bàn đóng dấu đến sân ga tàu chiều giảm | \(E_i\) giây |
Ghi ra đầu ra chuẩn một dòng chứa một số nguyên là thời gian ít nhất, tính bằng giây, để hoàn thành hoạt động sưu tập dấu.
Tất cả dữ liệu đầu vào thỏa mãn:
Ví dụ 1
4 1
1 1 1 1
1 9 9 1
9 9 1 1
1 9 9 1
23
Có thể hoàn thành hoạt động sưu tập dấu trong thời gian ngắn nhất bằng cách xuất phát từ ga \(0\), rồi lần lượt ghé các ga \(2\), \(1\), \(4\), \(3\), \(1\), \(5\).
Ví dụ 2
6 2
5 5 3 5
9 7 9 3
3 4 9 4
8 2 6 6
8 5 7 5
3 2 1 6
73