Çift Kondansatörler


12

Kondansatörler, yüksek toleranslarla üretildiği için ünlüdür. Bu birçok durumda kabul edilebilir, ancak bazen sıkı toleranslı bir kapasite gereklidir. Tam olarak ihtiyacınız olan değere sahip bir kapasite elde etmek için yaygın bir strateji, kapasiteleri ihtiyacınız olan aralıkta bir şeye katkıda bulunacak şekilde dikkatlice ölçülen iki kapasitör paralel olarak kullanmaktır.

Bu meydan okumadaki amaç, (çoklu) bir dizi kapasite verildiğinde, kapasitörleri her bir çiftin toplam kapasitesi belirli bir aralıkta olacak şekilde eşleştirmektir. Ayrıca en iyi eşleşme setini, yani mümkün olduğunca çok çift bulunacak şekilde eşleşme kümesini bulmanız gerekir.

Kısıtlamalar

  1. Girdi bir seçim biçimini içerir
    • sahip olduğunuz (çoklu) kapasitör setini temsil eden sıralanmamış bir kapasite listesi
    • hedef aralığın alt ve üst sınırını temsil eden bir çift kapasite (dahil)
  2. girişteki tüm kapasiteler 2 30'dan küçük pozitif tamsayılardır , ünite pF'dir (önemli değil).
  3. Girişteki kapasiteler listesine ek olarak, sahip olduğunuz kapasitörler seti , 0 pF değerine sahip sonsuz miktarda kapasitör içerir.
  4. Çıktı, bir seçim formatında, her bir çiftin toplamının belirtilen hedef aralıkta olacağı şekilde bir çift kapasite listesi içerir . Ne çiftlerin sırası ne de bir çift içindeki kapasitelerin sırası belirtilmez.
  5. Çıkıştaki hiçbir kapasite, sahip olduğunuz kapasitör setinde göründüğünden daha sık görünmeyebilir . Başka bir deyişle: Çıkttığınız çiftler çakışmamalıdır.
  6. Programınızın ürettiği çıkıştan daha fazla kapasite çiftini içeren 4 ve 5 koşullarını yerine getirebilecek olası bir çıktı olmayacaktır.
  7. Programınız O ( n !) Süresinde sona erecektir; burada n , sahip olduğunuz kapasitör setini temsil eden listenin uzunluğudur.
  8. Loopholes istismar edilmeyecektir
  9. Hedef menzil boş olmayacaktır

puanlama

Puanınız sekizli olarak çözümünüzün uzunluğudur. Eğer çözümünüz bu problemi polinom zaman O ( n k ) içinde bazı k için çözmeyi başarırsa , puanınızı 10'a bölün. Bunun gerçekten mümkün olup olmadığını bilmiyorum.

Örnek giriş

  • aralık 100 ila 100, giriş dizisi 100 100 100, geçerli çıktı:

    0 100
    0 100
    0 100
    
  • aralık 100 ila 120, giriş dizisi 20 80 100, geçerli çıktı:

    0 100
    20 80
    

    çıktı 20 100geçerli değil

  • aralık 90 ila 100, giriş dizisi 50 20 40 90 80 30 60 70 40, geçerli çıktı:

    0 90
    20 80
    30 70
    40 60
    40 50
    
  • aralık 90 ila 90, giriş dizisi 20 30 40 40 50 60 70 80 90, geçerli çıktı:

    0 90
    20 70
    30 60
    40 50
    
  • aralık 90 ila 110, giriş dizisi 40 60 50, geçerli çıktı:

    40 60
    

3
Bunun O (n log n) içinde kolayca çözülebileceğinden oldukça eminim. İlk olarak, aralıktaki kapasitörleri 0 pF ile birle eşleştirin. Gerisini sırala. En düşük ve en yüksek kapasitörü eşleştirmeye devam edin, eğer bu aralığın üzerindeyse en yüksek olanı atın, eğer en düşük olanı atın.
orlp

1
Bazı giriş / çıkış testleri iyi olurdu.
orlp

@orlp Zaten sordum, OP üzerinde çalışıyor
Beta Decay

2
@ orlp'nin algoritması çalışır, ancak kanıt bir yorum için uzun bir gölge. Özünde, minimal counterexample olmalıdır a <= b <= c <= dböyle a + d, a + c, b + daralıktaki tüm ama b + cdeğil, ama bu bir çelişki verir.
Peter Taylor

@orlp Sağlanan örnek girişi sizin için yararlı mı?
FUZxxl

Yanıtlar:


1

CJam, 5.6

Bu, algoritmanın orlp'nin cevabında doğrudan yeniden uygulanmasıdır . Cevabımı onaylarsanız, lütfen bu yanıtı da onayladığınızdan emin olun . Ayrıca orijinal algoritma ile cevabın kabul edildiğini de öneriyorum, çünkü bunu O (n * log (n)) 'da zarif bir şekilde nasıl çözeceğimi anladığımdan çok şüpheliyim.

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

Çevrimiçi deneyin

Örnek giriş:

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

Açıklama:

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.

Çıktı biçimini dilinize daha uygun olacak şekilde değiştirebilirsiniz. Çıktının kesin biçimi belirtilmez, yalnızca çıktı vermeniz gereken veriler belirtilir.
FUZxxl

6

Python 2, 11.5

Bir kez 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)]

Her normal için bir adet 0 pF kapasitör ekliyorum, daha fazla ihtiyaç duyulmuyor. Sonra kapasitörleri sıralarız ve en düşük ve en yüksek kapasitörü eşleştirmeye devam ederiz. Toplam, izin verilen aralık dahilindeyse, onu yazdırırız, aralığın üstündeyse en yüksek değeri atarız, eğer aşağıda en düşük değeri atarız.

Örnek giriş / çıkış:

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

0 90
20 80
30 70
40 60
40 50
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.