ตัวเก็บประจุคู่


12

ตัวเก็บประจุมีชื่อเสียงในการผลิตด้วยความทนทานสูง ซึ่งเป็นที่ยอมรับได้ในหลายกรณี แต่บางครั้งจำเป็นต้องใช้ความจุที่มีค่าความคลาดเคลื่อน จำกัด กลยุทธ์ทั่วไปในการรับกำลังการผลิตด้วยมูลค่าที่แน่นอนที่คุณต้องการคือการใช้ตัวเก็บประจุที่วัดอย่างรอบคอบสองชุดพร้อมกันเพื่อให้ความจุเพิ่มขึ้นกับบางสิ่งในช่วงที่คุณต้องการ

เป้าหมายในการท้าทายนี้คือกำหนดความจุ (หลายชุด) เพื่อจับคู่ตัวเก็บประจุเพื่อให้ความจุรวมของแต่ละคู่อยู่ในช่วงที่กำหนด คุณต้องค้นหาชุดการจับคู่ที่ดีที่สุดนั่นคือชุดการจับคู่ที่พบมากที่สุดเท่าที่จะเป็นไปได้

ข้อ จำกัด

  1. อินพุตประกอบด้วยรูปแบบของตัวเลือก
    • รายการความจุที่ไม่มีการเรียงลำดับซึ่งเป็นตัวแทนของชุดตัวเก็บประจุ (หลาย) ที่คุณมี
    • คู่ของความจุที่แสดงขอบเขตล่างและบนของช่วงเป้าหมาย (รวม)
  2. ความจุทั้งหมดในอินพุตเป็นจำนวนเต็มบวกที่น้อยกว่า 2 30หน่วยคือ pF (ไม่ใช่แบบนั้นสำคัญ)
  3. นอกเหนือจากรายการความจุในอินพุตชุดตัวเก็บประจุที่คุณยังมีจำนวนของตัวเก็บประจุที่ไม่มีที่สิ้นสุดที่มีค่า 0 pF
  4. เอาต์พุตประกอบด้วยรูปแบบของตัวเลือกรายการคู่ของความจุซึ่งผลรวมของแต่ละคู่อยู่ในช่วงเป้าหมายที่ระบุ ไม่ได้ระบุลำดับของคู่หรือลำดับความจุภายในคู่
  5. ความจุในการส่งออกไม่อาจปรากฏบ่อยขึ้นกว่าที่ปรากฏอยู่ในชุดของตัวเก็บประจุที่คุณมี กล่าวอีกนัยหนึ่ง: คู่ที่คุณส่งออกจะต้องไม่ทับซ้อนกัน
  6. จะต้องไม่มีเงื่อนไขที่เป็นไปได้สำหรับผลลัพธ์ที่เป็นไปได้ 4 และ 5 ที่มีความจุมากกว่าคู่ที่เอาต์พุตของโปรแกรมของคุณสร้างขึ้น
  7. โปรแกรมของคุณจะยุติในเวลา O ( n !) โดยที่nคือความยาวของรายการที่แสดงถึงชุดของตัวเก็บประจุที่คุณมี
  8. ช่องโหว่จะไม่ถูกทารุณกรรม
  9. ช่วงเป้าหมายจะต้องไม่ว่างเปล่า

เกณฑ์การให้คะแนน

คะแนนของคุณคือความยาวของการแก้ปัญหาของคุณใน octets หากวิธีการแก้ปัญหาของคุณจัดการเพื่อแก้ปัญหานี้ในเวลาพหุนาม O ( n k ) สำหรับkบางส่วนให้หารคะแนนของคุณด้วย 10 ฉันไม่ทราบว่าเป็นไปได้จริง

ตัวอย่างอินพุต

  • ช่วง 100 ถึง 100, อินพุตอาร์เรย์100 100 100, เอาต์พุตที่ถูกต้อง:

    0 100
    0 100
    0 100
    
  • ช่วง 100 ถึง 120, อินพุตอาร์เรย์20 80 100, เอาต์พุตที่ถูกต้อง:

    0 100
    20 80
    

    เอาต์พุต20 100ไม่ถูกต้อง

  • ช่วง 90 ถึง 100, อินพุตอาร์เรย์50 20 40 90 80 30 60 70 40, เอาต์พุตที่ถูกต้อง:

    0 90
    20 80
    30 70
    40 60
    40 50
    
  • ช่วง 90 ถึง 90, อินพุตอาร์เรย์20 30 40 40 50 60 70 80 90, เอาต์พุตที่ถูกต้อง:

    0 90
    20 70
    30 60
    40 50
    
  • ช่วง 90 ถึง 110, อินพุตอาร์เรย์40 60 50, เอาต์พุตที่ถูกต้อง:

    40 60
    

3
ฉันค่อนข้างแน่ใจว่าสิ่งนี้สามารถแก้ไขได้อย่างง่ายดายใน O (n log n) ก่อนอื่นให้จับคู่ตัวเก็บประจุใด ๆ ที่อยู่ในช่วงหนึ่งเป็น 0 pF จัดเรียงส่วนที่เหลือ จับคู่ตัวเก็บประจุต่ำสุดและสูงที่สุดต่อไปนี้ถ้าอยู่เหนือช่วงที่จะละทิ้งค่าสูงสุดถ้ามันอยู่ต่ำกว่าจะทิ้งค่าต่ำสุด
orlp

1
การทดสอบอินพุต / เอาต์พุตบางอย่างน่าจะดี
orlp

@ orlp ฉันได้ถามไปแล้ว OP กำลังทำงานอยู่
Beta Decay

2
อัลกอริทึมของ @ orlp ทำงานได้ แต่การพิสูจน์มีความยาวสำหรับความคิดเห็น โดยพื้นฐานแล้วตัวอย่างที่น้อยที่สุดจะต้องมีa <= b <= c <= dตัวอย่างที่a + d, a + c, b + dอยู่ในช่วง แต่b + cไม่ใช่ แต่มีความขัดแย้ง
Peter Taylor

@orlp อินพุตตัวอย่างที่ให้มามีประโยชน์กับคุณหรือไม่
FUZxxl

คำตอบ:


1

CJam, 5.6

นี่คือการนำอัลกอริทึมกลับมาใช้ใหม่โดยตรงในคำตอบของorlp หากคุณตอบคำถามของฉันโปรดตรวจสอบให้แน่ใจว่าคุณได้ตอบคำถามนี้ด้วย ฉันยังแนะนำว่าคำตอบด้วยอัลกอริทึมดั้งเดิมเป็นที่ยอมรับเพราะฉันสงสัยมากว่าฉันจะหาวิธีแก้ปัญหานี้ได้อย่างสวยงามใน O (n * log (n))

l~_,0a*+${(\)@_2$+4$~2$\>{;;\;\+}{<{;+}{oSop}?}?_,1>}g;;

ลองออนไลน์

ตัวอย่างอินพุต:

[90 100] [50 20 40 90 80 30 60 70 40]

คำอธิบาย:

l~      Get and interpret input.
_,      Get length of resistor list.
0a*+    Append the same number of 0 values.
$       Sort the list.
{       Loop until less than 2 entries in list.
  (       Pop off first value.
  \)      Pop off last value.
  @_      Pull first value to top, and copy it.
  2$      Copy last value to top.
  +       Add first and last value.
  4$~     Copy specified range to top, and unwrap the two values.
  2$      Copy sum to top.
  \>      Swap and compare for sum to be higher than top of range.
  {       It's higher.
    ;;\;    Some stack cleanup.
    \+      Put first value back to start of resistor list.
  }
  {       Not higher, so two cases left: value is in range, or lower.
    <       Compare if sum is lower than bottom of range.
    {       It's lower.
      ;+      Clean up stack and put last value back to end of resistor list.
    }
    {       Inside range, time to produce some output.
      o       Output first value.
      So      Output space.
      p       Output second value and newline.
    }?      Ternary operator for comparison with lower limit.
  }?      Ternary operator for comparison with upper limit.
  _,      Get length of remaining resistor list.
  1>      Check if greater 1.
}g      End of while loop for processing resistor list.
;;      Clean up stack, output was generated on the fly.

คุณสามารถเปลี่ยนรูปแบบผลลัพธ์ให้เหมาะกับภาษาของคุณมากขึ้น ไม่ได้ระบุรูปแบบที่แน่นอนของข้อมูลเฉพาะข้อมูลที่คุณต้องส่งออกเท่านั้น
FUZxxl

6

Python 2, 11.5

Python golf ครั้งเดียว:

(a,b),l=input()
l=[0]*len(l)+sorted(l)
while l:
 e=l[0]+l[-1]
 if a<=e<=b:print l[0],l[-1]
 l=l[e<=b:len(l)-(a<=e)]

ฉันเพิ่มตัวเก็บประจุ 0 pF หนึ่งตัวสำหรับทุกตัวปกติไม่จำเป็นอีกต่อไป จากนั้นเราเรียงลำดับตัวเก็บประจุและทำการจับคู่ตัวเก็บประจุต่ำสุดและสูงสุด หากผลรวมอยู่ในช่วงที่เราอนุญาตให้พิมพ์ได้หากอยู่เหนือช่วงที่เราละทิ้งค่าสูงสุดหากอยู่ต่ำกว่าระดับต่ำสุด

ตัวอย่างอินพุต / เอาต์พุต:

[[90,100], [20,30,40,40,50,60,70,80,90]]

0 90
20 80
30 70
40 60
40 50
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.