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 3và 3 3cặp (từ khối 5 5,5 4 và 4 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:

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