รับรายการวงกลมส่งออกพื้นที่ของสี่เหลี่ยมที่เล็กที่สุดที่มี


28

คุณจะได้รับรายชื่อรัศมีคุณจะต้องส่งออกพื้นที่ของสี่เหลี่ยมเล็ก ๆ ที่พวกเขาจะพอดี

ตัวอย่างเช่นกำหนดรายการที่คุณจะเอาท์พุท[5,3,1.5]157.460

นี่คือภาพ:

ความกว้างคือ 15.7460 และความสูงคือ 10 ดังนั้นพื้นที่คือ 157.460

กฎ:

  • คุณได้รับรายการผ่าน stdin หรือฟังก์ชันอาร์กิวเมนต์เอาท์พุทคำตอบผ่าน stdout หรือฟังก์ชันส่งคืน

  • รัศมีจะมีทศนิยมได้ไม่เกิน 2 ตำแหน่ง

  • รายการจะมีความยาวระหว่าง 2 ถึง 6

  • ผลลัพธ์ควรมีความถูกต้องถึงทศนิยม 3 ตำแหน่งหรือมากกว่า

  • หากคุณต้องการπ = 3.1416

กรณีทดสอบ:

  • [5,3,1.5] = 157.460

  • [9,4,8,2] = 733.431- การทำงานที่นี่

  • [18,3,1] = 1296.000

รหัสที่สั้นที่สุดในหน่วยไบต์ชนะ



1
ฉันไม่เห็นเกณฑ์การชนะอย่างมีเป้าหมาย
Maltysen

นั่นเป็นหนึ่งในกฎกลางที่สำคัญที่สุดของเรา
Maltysen

2
@Tim ส่วนใหญ่เป็นโค้ดกอล์ฟโดยมีเป้าหมายในการเข้ารหัสเป็นไบต์ที่น้อยที่สุด ฉันคิดว่านี่น่าจะเป็นความท้าทายที่ดีสำหรับการเล่นกอล์ฟเนื่องจากมีสเป็คที่แน่นอน
xnor

ฉันขอแนะนำให้กำจัดเงื่อนไข "ปัดเศษไม่ถูกตัดทอน" เนื่องจากอุปกรณ์ต่อพ่วงกับงานและบางภาษาสามารถทำได้ในขณะที่คนอื่นต้องการการเข้ารหัสพิเศษเพื่อให้เกิดขึ้น ฉันไม่แน่ใจว่าคุณตั้งใจจะให้ผลลัพธ์มากกว่าทศนิยม 3 ตำแหน่งหรือไม่ แต่ฉันขอแนะนำให้อนุญาตด้วยเช่นกัน
xnor

คำตอบ:


16

Python 2 + PySCIPOpt , 267 ไบต์

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()

มันทำงานอย่างไร

เราเขียนปัญหาดังต่อไปนี้: ย่อขนาดcบนตัวแปรa , b , c , x 1 , y 1 , …, x n , y n , โดยที่

  • abc ;
  • r ix ia - r iและr iy ib - y i , สำหรับ 1 ≤ in ;
  • ( x ฉัน - x J ) 2 + ( y ที่ฉัน - Y J ) 2 ≥ ( R ฉัน + R J ) 2 , 1 ≤ J < ฉัน ≤ n

เห็นได้ชัดว่าเรากำลังใช้ไลบรารีการเพิ่มประสิทธิภาพภายนอกกับข้อ จำกัด เหล่านี้ แต่คุณไม่สามารถป้อนพวกมันให้กับเครื่องมือเพิ่มประสิทธิภาพแบบเก่า ๆ ได้แม้กระทั่ง Mathematica NMinimizeจะติดอยู่ที่ minima ท้องถิ่นสำหรับกรณีทดสอบเล็ก ๆ เหล่านี้ หากคุณจ้องที่ข้อ จำกัด อย่างใกล้ชิดคุณจะเห็นว่าพวกเขาเป็นโปรแกรมกำลังสองที่ถูก จำกัด ด้วยกำลังสองและการค้นหาระดับโลกที่เหมาะสมที่สุดสำหรับ QCQP แบบไม่นูนนั้นคือ NP-hard ดังนั้นเราต้องการเวทย์มนตร์พลังสูงอย่างไม่น่าเชื่อ ฉันเลือกSCIPตัวแก้จุดแข็งในอุตสาหกรรมซึ่งเป็นตัวแก้ QCQP ระดับโลกเพียงตัวเดียวที่ฉันสามารถหาได้โดยมีใบอนุญาตฟรีสำหรับใช้ในเชิงวิชาการ อย่างมีความสุขมันมีการผูก Python ที่ดีมาก

อินพุตและเอาต์พุต

ผ่านรายการรัศมีใน stdin [5,3,1.5]เช่น แสดงให้เห็นว่าการส่งออกobjective value:ในพื้นที่สี่เหลี่ยมผืนผ้าx1, x2ขนาดสี่เหลี่ยมผืนผ้าx3พื้นที่สี่เหลี่ยมอีกครั้งx4, x5พิกัดศูนย์วงกลมแรกx6, x7สองพิกัดศูนย์วงกลม ฯลฯ

กรณีทดสอบ

[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

ดีกว่าทางออกของ OP ขนาดที่แน่นอนคือ 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)

กรณีโบนัส

[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)

ความอัปยศสุดท้ายให้ข้อผิดพลาดการปัดเศษเล็กน้อย แต่งานดี!
ทิม

ดูเหมือนว่าฉันจะสามารถปรับปรุง [1,2,3,4,5] ได้โดยการทำให้รัศมี 3 และรัศมี 5 วงกลมสัมผัสได้จากนั้นหมุนรัศมี 4 / รัศมี 5 ในแนวทแยงมุมตามเข็มนาฬิกาเล็กน้อย (รัศมี 1 วงกลมจะต้อง ถูกย้ายออกไป แต่ก็มีพื้นที่ว่างมากมายสำหรับสิ่งนั้นทั้งสัญชาตญาณของฉันและการคำนวณของฉันบ่งชี้ว่าสี่เหลี่ยมบางยาวสามารถมีรัศมี 4 / รัศมี 5 วงกลมได้อย่างมีประสิทธิภาพมากกว่าสแควร์
ริเวอร์

@LevelRiverSt ฉันไม่เห็นด้วย การเลื่อน 3 ขึ้นไปแตะ 5 จะผลัก 4 ออกไปทางขวา (ทวนเข็มนาฬิกาจาก 5) อย่าปล่อยให้มันขยับไปทางซ้าย (ตามเข็มนาฬิกาจาก 5) การกำหนดค่าโปรแกรมของฉันคือ (7 + 4√3) × (9 + √ (29 + 16√3)) ≈ 13.9282 × 16.5308 ≈ 230.244 ในขณะที่การตั้งค่าที่แนะนำคือ (30 + 15√3) / 4 × (36 + 3 √5 + 6√15) / 4 ≈ 13.9952 × 16.4865 ≈ 230.732
Anders Kaseorg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.