Săn Kho Báu
Nộp bài giải
Điểm:
7,00 (OI)
Giới hạn thời gian:
3.0s
Giới hạn bộ nhớ:
256M
Đầu vào:
stdin
Đầu ra:
stdout
Dạng bài
Ngôn ngữ cho phép
Ada, Algol, Assembly, Awk, C, C#, C++, D, Dart, Forth, Fortran, Go, Groovy, Java, Javascript, Kotlin, Lisp, Lua, Nim, ObjC, Pascal, Perl, PHP, Pike, Python, Racket, Ruby, Rust, Scheme, Scratch, Sed, TCL, Typescript, V, Zig
Bạn đang ở trên một hòn đảo được biểu diễn bởi một lưới . Các hàng được đánh số từ đến , các cột từ đến . Trên đảo có kho báu, kho báu thứ nằm tại ô .
Ban đầu bạn đứng ở góc dưới bên trái của lưới, tức ô . Nếu tại bất kỳ thời điểm nào bạn đứng trên một ô chứa kho báu, bạn nhặt nó mà không tốn thêm thời gian. Trong một bước di chuyển, bạn có thể đi lên (từ sang ), trái (từ sang ), hoặc phải (từ sang ). Vì bẫy, bạn không thể đi xuống.
Tuy nhiên, đi lên cũng rất nguy hiểm. Bạn chỉ có thể đi lên khi đang ở một cột an toàn. Có cột an toàn: .
Hãy tính số bước di chuyển tối thiểu để thu thập tất cả các kho báu.
Dữ liệu vào
- Dòng đầu chứa bốn số nguyên — số hàng, số cột, số kho báu và số cột an toàn.
- dòng tiếp theo, mỗi dòng chứa hai số nguyên — tọa độ ô chứa kho báu thứ . Các kho báu nằm ở các ô phân biệt.
- Dòng cuối cùng chứa số nguyên phân biệt — các cột an toàn.
Dữ liệu ra
In ra số bước di chuyển tối thiểu để thu thập tất cả các kho báu.
Ràng buộc
- ,
- , các phân biệt.
Ví dụ
| Input | Output | Giải thích |
|---|---|---|
| 3 6 3 2 1 6 2 2 3 4 1 6 |
15 | Tối ưu: lấy kho báu tại , đi lên hàng tại cột , lấy kho báu , đi lên hàng tại cột , rồi lấy kho báu — tổng cộng bước. |
| 3 3 3 2 1 1 2 1 3 1 2 3 |
6 | Dùng cột làm cột đi lên; mỗi hàng lấy kho báu ở cột . |
| 3 5 3 2 1 2 2 3 3 1 1 5 |
8 | Dùng cột làm cột đi lên là tối ưu. |
Bình luận