Pasangkan Kapasitor

12

Kapasitor terkenal karena diproduksi dengan toleransi tinggi. Ini dapat diterima dalam banyak kasus, tetapi beberapa kali dibutuhkan kapasitas dengan toleransi yang ketat. Strategi umum untuk mendapatkan kapasitas dengan nilai persis yang Anda butuhkan adalah dengan menggunakan dua kapasitor yang diukur secara hati-hati secara paralel sehingga kapasitasnya bertambah hingga sesuatu dalam kisaran yang Anda butuhkan.

Sasaran dalam tantangan ini adalah, mengingat satu set (multi) kapasitas, untuk memasangkan kapasitor sedemikian sehingga total kapasitas masing-masing pasangan berada dalam kisaran yang diberikan. Anda juga perlu menemukan pasangan yang terbaik, yaitu pasangan yang dapat ditemukan sebanyak mungkin pasangan.

Kendala

  1. Input terdiri dari format pilihan
    • daftar kapasitas unordered yang mewakili set (multi) kapasitor yang Anda miliki
    • sepasang kapasitas yang mewakili batas bawah dan atas kisaran target (inklusif)
  2. semua kapasitas dalam input bilangan bulat positif lebih kecil dari 2 30 , unitnya adalah pF (bukan yang penting).
  3. Selain daftar kapasitas dalam input, set kapasitor yang Anda miliki juga berisi jumlah kapasitor yang tak terbatas dengan nilai 0 pF.
  4. Output terdiri dalam format pilihan daftar pasangan kapasitas sehingga jumlah masing-masing pasangan berada dalam kisaran target yang ditentukan. Baik urutan pasangan maupun urutan kapasitas dalam pasangan ditentukan.
  5. Tidak ada kapasitas dalam output yang mungkin muncul lebih sering daripada yang muncul di set kapasitor yang Anda miliki . Dengan kata lain: Pasangan yang Anda hasilkan tidak boleh tumpang tindih.
  6. Tidak akan ada kemungkinan hasil kondisi memuaskan 4 dan 5 yang mengandung lebih banyak pasangan kapasitas daripada output yang dihasilkan program Anda.
  7. Program Anda akan berakhir dalam waktu O ( n !) Di mana n adalah panjang daftar yang mewakili set kapasitor yang Anda miliki
  8. Celah tidak akan disalahgunakan
  9. Rentang target tidak boleh kosong

Mencetak gol

Skor Anda adalah panjang solusi Anda dalam oktet. Jika solusi Anda berhasil memecahkan masalah ini dalam polinomial waktu O ( n k ) untuk beberapa k , membagi skor dengan 10. Saya tidak tahu apakah ini sebenarnya mungkin.

Input sampel

  • kisaran 100 hingga 100, array input 100 100 100, output yang valid:

    0 100
    0 100
    0 100
    
  • kisaran 100 hingga 120, array input 20 80 100, output yang valid:

    0 100
    20 80
    

    outputnya 20 100tidak valid

  • kisaran 90 hingga 100, input array 50 20 40 90 80 30 60 70 40, output yang valid:

    0 90
    20 80
    30 70
    40 60
    40 50
    
  • kisaran 90 hingga 90, input array 20 30 40 40 50 60 70 80 90, output yang valid:

    0 90
    20 70
    30 60
    40 50
    
  • kisaran 90 hingga 110, input array 40 60 50, output yang valid:

    40 60
    
FUZxxl
sumber
3
Saya cukup yakin ini dapat dengan mudah diselesaikan di O (n log n). Pertama, pasangkan kapasitor apa pun dalam rentang ke satu dengan 0 pF. Sortir sisanya. Tetap memasangkan kapasitor terendah dan tertinggi, jika ini di atas kisaran, buang yang tertinggi, jika di bawah ini buang yang terendah.
orlp
1
Beberapa tes input / output akan lebih baik.
orlp
@ orlp Saya sudah bertanya, OP sedang mengerjakannya
Beta Decay
2
Algoritma @ orlp bekerja, tetapi buktinya lama untuk komentar. Pada dasarnya, sampel tandingan minimal harus memiliki a <= b <= c <= dyang a + d, a + c, b + dsemuanya berada dalam jangkauan tetapi b + ctidak, tetapi itu memberikan kontradiksi.
Peter Taylor
@ orlp Apakah input sampel yang disediakan bermanfaat bagi Anda?
FUZxxl

Jawaban:

1

CJam, 5.6

Ini adalah implementasi ulang langsung dari algoritma dalam jawaban orlp . Jika Anda memperbaiki jawaban saya, pastikan Anda juga memilih jawaban ini . Saya juga menyarankan bahwa jawaban dengan algoritma asli diterima, karena saya sangat ragu bahwa saya akan menemukan cara untuk menyelesaikan ini dengan elegan di O (n * log (n)).

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

Cobalah online

Input sampel:

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

Penjelasan:

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.
Reto Koradi
sumber
Anda dapat mengubah format output menjadi lebih cocok untuk bahasa Anda. Format output yang tepat tidak ditentukan, hanya data yang Anda harus output.
FUZxxl
6

Python 2, 11.5

Golf Python untuk sekali:

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

Saya menambahkan satu kapasitor 0 pF untuk setiap kapasitor biasa, tidak pernah ada lagi yang dibutuhkan. Kemudian kami menyortir kapasitor dan terus memasangkan kapasitor terendah dan tertinggi. Jika jumlahnya berada dalam rentang yang diizinkan, kami mencetaknya, jika itu di atas kisaran, kami membuang yang tertinggi, jika jumlahnya di bawah, buang yang terendah.

Contoh input / output:

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

0 90
20 80
30 70
40 60
40 50
orlp
sumber