Đưa ra một danh sách các vòng tròn, xuất diện tích hình chữ nhật nhỏ nhất chứa


28

Bạn sẽ được cung cấp một danh sách bán kính, bạn phải xuất diện tích của hình chữ nhật nhỏ nhất mà tất cả chúng sẽ phù hợp.

Ví dụ, đưa ra danh sách [5,3,1.5]bạn sẽ xuất ra 157.460.

Đây là hình ảnh:

Chiều rộng là 15,7460 và chiều cao là 10, vì vậy diện tích là 157,460

Quy tắc:

  • Bạn nhận được danh sách thông qua stdin hoặc đối số hàm, xuất câu trả lời qua thiết bị xuất chuẩn hoặc trả về hàm.

  • Bán kính sẽ có tối đa 2 chữ số thập phân.

  • Danh sách sẽ có độ dài từ 2 đến 6.

  • Đầu ra phải chính xác đến 3 chữ số thập phân trở lên.

  • Nếu bạn cần, π = 3.1416.

Các trường hợp thử nghiệm:

Mã ngắn nhất trong byte thắng.



1
tôi không thấy một tiêu chí chiến thắng khách quan
Maltysen

đó là một trong những quy tắc trung tâm nhất của chúng tôi
Maltysen

2
@Tim Hầu hết là golf mã, với mục tiêu mã hóa nó trong vài byte nhất. Tôi nghĩ rằng điều này sẽ làm cho một thử thách golf mã tốt, vì nó có một thông số chính xác.
xnor

Tôi khuyên bạn nên loại bỏ điều kiện "làm tròn không cắt ngắn" vì nó ngoại vi đối với tác vụ và một số ngôn ngữ chỉ có thể làm điều đó trong khi những ngôn ngữ khác cần thêm mã hóa để thực hiện. Tôi không chắc nếu bạn dự định sẽ ổn khi xuất hơn 3 chữ số thập phân, nhưng tôi cũng khuyên bạn nên cho phép điều đó.
xnor

Câu trả lời:


16

Python 2 + PySCIPOpt , 267 byte

from pyscipopt import*
R=input()
m=Model()
V,C=m.addVar,m.addCons
a,b,c=V(),V(),V()
m.setObjective(c)
C(a*b<=c)
P=[]
for r in R:
 x,y=V(),V();C(r<=x);C(x<=a-r);C(r<=y);C(y<=b-r)
 for u,v,s in P:C((x-u)**2+(y-v)**2>=(r+s)**2)
 P+=(x,y,r),
m.optimize()
m.printBestSol()

Làm thế nào nó hoạt động

Chúng tôi viết bài toán như sau: tối thiểu hóa c qua các biến a , b , c , x 1 , y 1 , Rò, x n , y n , trong đó

  • abc ;
  • r i x ia - r ir iy ib - y i , với 1 ≤ in ;
  • ( x i - x j ) 2 + ( y i - y j ) 2 ≥ ( r i + r j ) 2 , với 1 ≤ j < in .

Rõ ràng, chúng tôi đang sử dụng một thư viện tối ưu hóa bên ngoài trên các ràng buộc này, nhưng bạn không thể đưa chúng vào bất kỳ trình tối ưu hóa cũ nào, ngay cả Mathicala cũng NMinimizebị kẹt ở cực tiểu cục bộ cho các trường hợp thử nghiệm nhỏ này. Nếu bạn nhìn kỹ vào các ràng buộc, bạn sẽ thấy rằng chúng tạo thành một chương trình bậc hai bị ràng buộc theo phương pháp bậc hai và việc tìm kiếm tối ưu toàn cầu cho QCQP không lồi là NP-hard. Vì vậy, chúng ta cần một số phép thuật cực kỳ mạnh mẽ. Tôi đã chọn bộ giải SCIP độ bền công nghiệp , đây là bộ giải QCQP toàn cầu duy nhất tôi có thể tìm thấy với nhiều giấy phép miễn phí cho sử dụng học thuật. Hạnh phúc, nó có một số ràng buộc Python rất tốt đẹp.

Đầu vào và đầu ra

Vượt qua danh sách bán kính trên stdin, thích [5,3,1.5]. Những buổi biểu diễn đầu ra objective value:diện tích hình chữ nhật, x1, x2kích thước hình chữ nhật, x3diện tích hình chữ nhật một lần nữa, x4, x5đầu tiên tọa độ trung tâm vòng tròn, x6, x7vòng tròn thứ hai tọa độ trung tâm, vv

Các trường hợp thử nghiệm

[5,3,1.5]157.459666673757

5,3,1,5

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 0.04
Solving Nodes      : 187
Primal Bound       : +1.57459666673757e+02 (9 solutions)
Dual Bound         : +1.57459666673757e+02
Gap                : 0.00 %
objective value:                     157.459666673757
x1                                                 10   (obj:0)
x2                                   15.7459666673757   (obj:0)
x3                                   157.459666673757   (obj:1)
x4                                                  5   (obj:0)
x5                                                  5   (obj:0)
x6                                                  7   (obj:0)
x7                                   12.7459666673757   (obj:0)
x8                                                1.5   (obj:0)
x9                                   10.4972522849871   (obj:0)

[9,4,8,2]709.061485909243

Điều này tốt hơn giải pháp của OP. Kích thước chính xác là 18 x 29 + 6√3.

9,4,8,2

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 1.07
Solving Nodes      : 4650
Primal Bound       : +7.09061485909243e+02 (6 solutions)
Dual Bound         : +7.09061485909243e+02
Gap                : 0.00 %
objective value:                     709.061485909243
x1                                                 18   (obj:0)
x2                                   39.3923047727357   (obj:0)
x3                                   709.061485909243   (obj:1)
x4                                                  9   (obj:0)
x5                                   30.3923047727357   (obj:0)
x6                                                 14   (obj:0)
x7                                   18.3923048064677   (obj:0)
x8                                                  8   (obj:0)
x9                                                  8   (obj:0)
x10                                                 2   (obj:0)
x11                                  19.6154311552252   (obj:0)

[18,3,1]1295.999999999

18,3,1

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 0.00
Solving Nodes      : 13
Primal Bound       : +1.29599999999900e+03 (4 solutions)
Dual Bound         : +1.29599999999900e+03
Gap                : 0.00 %
objective value:                       1295.999999999
x1                                   35.9999999999722   (obj:0)
x2                                                 36   (obj:0)
x3                                     1295.999999999   (obj:1)
x4                                   17.9999999999722   (obj:0)
x5                                                 18   (obj:0)
x6                                   32.8552571627738   (obj:0)
x7                                                  3   (obj:0)
x8                                                  1   (obj:0)
x9                                                  1   (obj:0)

Trường hợp thưởng

[1,2,3,4,5]230.244214912998

1,2,3,4,5

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 401.31
Solving Nodes      : 1400341
Primal Bound       : +2.30244214912998e+02 (16 solutions)
Dual Bound         : +2.30244214912998e+02
Gap                : 0.00 %
objective value:                     230.244214912998
x1                                   13.9282031800476   (obj:0)
x2                                    16.530790960676   (obj:0)
x3                                   230.244214912998   (obj:1)
x4                                                  1   (obj:0)
x5                                   9.60188492354373   (obj:0)
x6                                    11.757778088743   (obj:0)
x7                                   3.17450418828415   (obj:0)
x8                                                  3   (obj:0)
x9                                    13.530790960676   (obj:0)
x10                                  9.92820318004764   (obj:0)
x11                                   12.530790960676   (obj:0)
x12                                                 5   (obj:0)
x13                                                 5   (obj:0)

[3,4,5,6,7]553.918025310597

3,4,5,6,7

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 90.28
Solving Nodes      : 248281
Primal Bound       : +5.53918025310597e+02 (18 solutions)
Dual Bound         : +5.53918025310597e+02
Gap                : 0.00 %
objective value:                     553.918025310597
x1                                   21.9544511351279   (obj:0)
x2                                   25.2303290086403   (obj:0)
x3                                   553.918025310597   (obj:1)
x4                                                  3   (obj:0)
x5                                   14.4852813557912   (obj:0)
x6                                   4.87198593295855   (obj:0)
x7                                   21.2303290086403   (obj:0)
x8                                   16.9544511351279   (obj:0)
x9                                                  5   (obj:0)
x10                                                 6   (obj:0)
x11                                                 6   (obj:0)
x12                                  14.9544511351279   (obj:0)
x13                                  16.8321595389753   (obj:0)

[3,4,5,6,7,8]777.87455544487

3,4,5,6,7,8

SCIP Status        : problem is solved [optimal solution found]
Solving Time (sec) : 218.29
Solving Nodes      : 551316
Primal Bound       : +7.77874555444870e+02 (29 solutions)
Dual Bound         : +7.77874555444870e+02
Gap                : 0.00 %
objective value:                      777.87455544487
x1                                   29.9626413867546   (obj:0)
x2                                   25.9614813640722   (obj:0)
x3                                    777.87455544487   (obj:1)
x4                                   13.7325948669477   (obj:0)
x5                                   15.3563780595534   (obj:0)
x6                                   16.0504838821134   (obj:0)
x7                                   21.9614813640722   (obj:0)
x8                                   24.9626413867546   (obj:0)
x9                                   20.7071098175984   (obj:0)
x10                                                 6   (obj:0)
x11                                  19.9614813640722   (obj:0)
x12                                                 7   (obj:0)
x13                                                 7   (obj:0)
x14                                  21.9626413867546   (obj:0)
x15                                  8.05799919177801   (obj:0)

Xấu hổ cái cuối cùng cho một lỗi làm tròn nhẹ, nhưng công việc tốt!
Tim

Có vẻ như tôi có thể cải thiện [1,2,3,4,5] bằng cách làm cho bán kính 3 và bán kính 5 vòng tròn chạm vào nhau, sau đó xoay bán kính 4 / bán kính 5 theo chiều kim đồng hồ một chút (bán kính 1 vòng tròn sẽ phải Được di chuyển ra khỏi đường nhưng có rất nhiều không gian chết cho điều đó. Cả bản năng và tính toán của tôi chỉ ra rằng một hình chữ nhật dài, mỏng có thể chứa bán kính 4 / bán kính 5 vòng tròn hiệu quả hơn so với một hình vuông.
Level River St

@LevelRiverSt Tôi không đồng ý. Di chuyển 3 lên chạm 5 sẽ đẩy 4 sang phải (ngược chiều kim đồng hồ từ 5), không để nó di chuyển sang trái (theo chiều kim đồng hồ từ 5). Cấu hình chương trình của tôi là (7 + 4√3) × (9 + (29 + 16√3)) ≈ 13.9282 × 16.5308 230.244, trong khi cấu hình đề xuất của bạn là (30 + 15√3) / 4 × (36 + 3 √5 + 6√15) / 4 13.9952 × 16.4865 230.732.
Anders Kaseorg
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.