Cảnh sát Manhattan


8

Giới thiệu

Bạn là cảnh sát trưởng của NYPD và bạn đã được giao nhiệm vụ bố trí các sĩ quan cảnh sát để tất cả các đường phố đều được tuần tra. Đội hình của bạn có biên chế ngắn, tuy nhiên, có nghĩa là bạn cần bố trí càng ít sĩ quan càng tốt.

Thử thách

Đưa ra một bản đồ các khối, bạn phải trả lại số lượng sĩ quan nhỏ nhất cần thiết để bảo vệ đường phố.

Quy tắc

Có ba loại cảnh sát: cảnh sát L, cảnh sát T và cảnh sát chéo. Cảnh sát T chỉ có thể nhìn theo ba hướng. Cảnh sát L có thể nhìn xuống hai con đường vuông góc nhau. Các cảnh sát chéo có thể nhìn xuống tất cả bốn đường phố.

Bản đồ sẽ được cung cấp thông qua argv hoặc STDIN dưới dạng các số được phân tách bằng dấu cách. Các số đại diện cho số khối trong mỗi cột. Ví dụ:

Đầu vào 2 1đại diện cho bản đồ sau:

Đầu vào 3 1 2 4đại diện cho bản đồ sau:

Một sĩ quan cảnh sát chỉ có thể được đặt tại một giao lộ và tầm nhìn của nó chỉ có thể nằm dọc theo một bên của khối (cảnh sát có thể không nhìn vào các khu vực không có người ở).

Một cảnh sát chỉ có thể nhìn thấy một khối và không thể nhìn dọc theo một con phố nơi một cảnh sát khác đang nhìn có nghĩa là các đường ngắm không được trùng nhau.

Ví dụ

Đầu vào: 2 1

Đầu ra: 4


Đầu vào: 2 2

Đầu ra: 4


Đầu vào: 3 1 4 1 5 9

Đầu ra: 22

Chiến thắng

Mã ngắn nhất sẽ thắng.


3
Một cảnh sát có thể nhìn thấy bao xa? Tức là, nếu tôi đặt một cảnh sát trên một ngã tư, anh ta có thể nhìn thấy tất cả các con đường xuống cả hai đường phố không?
bến tàu

6
Điều gì ngăn tôi chỉ sử dụng cảnh sát chéo? Dường như không có vấn đề gì nếu một cảnh sát nhìn vào các khu vực không có người ở hoặc quét cùng khu vực với một cảnh sát khác, miễn là ít nhất một cảnh sát T hoặc L sẽ cần thiết ở đó.
Ingo Bürk

Nếu bạn thêm điều kiện là các đường ngắm không thể trùng nhau và cảnh sát không thể nhìn vào các khu vực không có người ở, điều này sẽ khó khăn hơn một chút. (không giúp ích cho tính hợp lý của câu chuyện, nhưng ...)
Geobits

2
Tôi đang hình dung Chief Wiggum, Lou và Eddie.
Renae Lider

Rõ ràng mọi người trở nên lo lắng quá mức nếu họ thấy quá nhiều cảnh sát cạnh nhau.
Kiểm đếm

Câu trả lời:


7

CJam, 68 61 84 ... 59 49 48 79 byte

l~]__,+:+M@{:Ze<:X2/)_2*X-@+@@-\Z}*;[YY]/_,(\R*_,,:)W%{2\2*1a*+2+/_S*\,(@+\}/;+

Đưa đầu vào ở định dạng giống như trong câu hỏi.

CẬP NHẬT : Đã sửa lỗi thuật toán cho các trường hợp thử nghiệm tương tự như những gì được chỉ ra bởi @nutki. Mặc dù nó làm cho mã có kích thước gần gấp đôi, nhưng sẽ cố gắng đánh gôn ngay bây giờ.

Cách thức hoạt động (Hơi không đầy đủ, sẽ thêm phần 2 1 2giải thích tương đương sau)

Ngay khi nhìn thấy câu hỏi này, tôi biết rằng sẽ có một công thức toán học để có câu trả lời. Sau khi thử một vài kết hợp, tôi đoán rằng công thức là2 * Number of blocks - Number of shared streets

Hãy kiểm tra là cho 2 1 trường hợp:

2 * 3 - 2 = 4

Chính xác.

Hãy kiểm tra 3 1 2 4 trường hợp:

2 * 10 - 10

Đúng lại. Yipee, vì vậy mã là

l~]:L:+2*L:(:+L(+-[{_@e<}*]:+-

Bây giờ hãy thử điều này trên một số ví dụ khác:

3 3

Đầu ra:

2 * 6 - 7 = 5

Nhưng chờ đã, câu trả lời thực tế là 6

Hãy thử cái khác:

5 5

2 * 10 - 13 = 7 // Answer is 9 instead.

Bạn thấy mẫu nào?

Đối với mỗi N Ncặp khối, trong đó N là số nguyên dương lớn hơn 2, tôi yêu cầu float((N+1)/2)-1thêm cop ngoài công thức trên. Hãy xác minh lại:

5 5 3

2 * 13 - 18 = 8 // Answer is 11

Trong ví dụ trên, chúng ta có 1 5 5cặp và 1 3 3cặp (từ các 5 3khối)

Hãy thử một ví dụ khác

5 5 4 4

2 * 18 - 27 = 9 // Answer is actually 14

Bạn phải suy nghĩ rằng chỉ có 5 5, 3 33 3cặp (từ khối 5 5,5 44 4resp.), Do đó chỉ có 4 cảnh sát yêu cầu thêm, nhưng có một cặp hơn.

Từ các khối 4 4, chúng tôi chỉ sử dụng hết 3 3để chúng tôi có 1 1miễn phí, điều này tạo nên một 3 3cặp khối khác có thể được hiển thị bằng hình ảnh bên dưới:

nhập mô tả hình ảnh ở đây

Các đường viền màu đỏ là các cặp thông thường, đường viền màu xanh là cặp vuông góc mà tôi đang nói ở trên.

Thật khó để giải thích vì trong khi màu đỏ được phác thảo chỉ chia sẻ 1 mặt của cặp, thì màu xanh cũng chia sẻ 1 khối + 1 khối. Nhưng logic này hoạt động cho tất cả các kết hợp khối.

Mã bây giờ chỉ đơn giản là tính toán đó.

l~]__                        "Read the input numbers, convert to array and make two copies";
     ,+                      "Get the number of columns and add that to the block array";
       :+                    "Sum the array elements to get number of blocks + columns";
         M@                  "Push empty array to stack and rotate input array to top";
{                         }* "Run this block for each pair in the block array";
 :Ze<:X                      "Store the later block size in Z, and minimum of two in X";
       @\-                   "Rotate swap and subtract shared sides from total sum";
          X)Y/(:T+           "Increment halve and decrement. Store in T and add to sum";
                  XTY*-      "Find unused blocks from this pair for perpendicular pairs";
                       @+    "Add unused blocks to the array M";
                         Z   "Push Z to stack to be used in next iteration";
           ;[YY]             "Pop the last pushed Z and push array [2 2] to stack";
                /,(+         "Check how many perpendicular pairs exist, add to total sum";

Lưu ý rằng 2 * Number of blocks - Number of shared sides cũng có thể được viết là Number of blocks + Number of columns - Number of shared sides between adjacant columns

Dùng thử trực tuyến tại đây


1
Điều này tạo ra đầu ra chính xác cho tất cả các thử nghiệm mà tôi đã thử cho đến nay.
Beta Decay

Tại sao đầu vào 2 2 2 đưa ra giải pháp 5? Bạn có thể giải thích làm thế nào một sự kết hợp 5 bộ là có thể?
Renae Lider

Kiểm tra 4 4 4 4là tốt. Công việc này mang lại 11, nhưng tôi không thể thấy bất kỳ cách nào để thực hiện với ít hơn 12.
COTO

Tôi biết tôi hơi muộn, nhưng nó hoạt động thế nào?
Beta Decay

Điều này đưa ra 18 cho 2 2 1 1 2 2 1 2 2 1 1 2 2ví dụ truy cập của tôi cho giải pháp @FireFly. Tuy nhiên tôi không thể thấy gì tốt hơn 19. Bạn có thể hiển thị vị trí cho trường hợp thử nghiệm này không?
nutki
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.