Cặp tụ điện


12

Tụ điện nổi tiếng là được sản xuất với dung sai cao. Điều này có thể chấp nhận được trong nhiều trường hợp, nhưng đôi khi cần phải có công suất với dung sai chặt chẽ. Một chiến lược chung để có được một công suất với giá trị chính xác mà bạn cần là sử dụng song song hai tụ điện được đo cẩn thận sao cho công suất của chúng cộng với một thứ gì đó trong phạm vi bạn cần.

Mục tiêu trong thử thách này là, đưa ra một tập hợp (nhiều) công suất, để ghép các tụ điện sao cho tổng công suất của mỗi cặp nằm trong một phạm vi nhất định. Bạn cũng cần tìm tập hợp các cặp tốt nhất, nghĩa là tập hợp các cặp sao cho càng nhiều cặp càng tốt.

Những ràng buộc

  1. Đầu vào bao gồm một định dạng của sự lựa chọn
    • một danh sách các công suất được sắp xếp đại diện cho bộ (nhiều) tụ điện bạn có
    • một cặp năng lực đại diện cho giới hạn dưới và trên của phạm vi mục tiêu (đã bao gồm)
  2. tất cả các công suất trong đầu vào là các số nguyên dương nhỏ hơn 2 30 , đơn vị là pF (không phải là vấn đề).
  3. Ngoài danh sách các công suất trong đầu vào, bộ tụ điện bạn có cũng chứa một lượng tụ vô hạn với giá trị 0 pF.
  4. Đầu ra bao gồm một định dạng lựa chọn một danh sách các cặp công suất sao cho tổng của mỗi cặp nằm trong phạm vi mục tiêu được chỉ định. Không phải thứ tự của các cặp cũng như thứ tự các năng lực trong một cặp được chỉ định.
  5. Không có công suất trong đầu ra có thể xuất hiện thường xuyên hơn nó xuất hiện trong bộ tụ điện bạn có . Nói cách khác: Các cặp bạn xuất không được trùng nhau.
  6. Sẽ không có đầu ra nào thỏa mãn điều kiện 4 và 5 có chứa nhiều cặp công suất hơn sản lượng mà chương trình của bạn tạo ra.
  7. Chương trình của bạn sẽ chấm dứt trong thời gian O ( n !) Trong đó n là độ dài của danh sách đại diện cho bộ tụ điện bạn có
  8. Lỗ hổng sẽ không bị lạm dụng
  9. Các phạm vi mục tiêu sẽ không có sản phẩm nào

Chấm điểm

Điểm của bạn là độ dài của giải pháp của bạn trong octet. Nếu giải pháp của bạn quản lý để giải quyết vấn đề này trong thời gian đa thức O ( n k ) cho một số k , hãy chia điểm của bạn cho 10. Tôi không biết điều này có thực sự khả thi hay không.

Đầu vào mẫu

  • phạm vi 100 đến 100, mảng đầu vào 100 100 100, đầu ra hợp lệ:

    0 100
    0 100
    0 100
    
  • phạm vi 100 đến 120, mảng đầu vào 20 80 100, đầu ra hợp lệ:

    0 100
    20 80
    

    đầu ra 20 100không hợp lệ

  • phạm vi 90 đến 100, mảng đầu vào 50 20 40 90 80 30 60 70 40, đầu ra hợp lệ:

    0 90
    20 80
    30 70
    40 60
    40 50
    
  • phạm vi 90 đến 90, mảng đầu vào 20 30 40 40 50 60 70 80 90, đầu ra hợp lệ:

    0 90
    20 70
    30 60
    40 50
    
  • phạm vi 90 đến 110, mảng đầu vào 40 60 50, đầu ra hợp lệ:

    40 60
    

3
Tôi khá chắc chắn điều này có thể dễ dàng được giải quyết trong O (n log n). Đầu tiên, ghép bất kỳ tụ điện nào trong phạm vi thành một với 0 pF. Sắp xếp phần còn lại. Tiếp tục ghép các tụ điện thấp nhất và cao nhất, nếu mức này vượt quá phạm vi loại bỏ mức cao nhất, nếu nó ở dưới mức thấp nhất.
orlp

1
Một số thử nghiệm đầu vào / đầu ra sẽ tốt đẹp.
orlp

@orlp Tôi đã hỏi, OP đang làm việc với nó
Beta Decay

2
Thuật toán của @ orlp hoạt động, nhưng bằng chứng là một sắc thái dài cho một nhận xét. Về bản chất, một phản ví dụ tối thiểu phải có a <= b <= c <= dnhư vậy mà a + d, a + c, b + dlà tất cả trong phạm vi nhưng b + ckhông phải là, nhưng đó đưa ra một mâu thuẫn.
Peter Taylor

@orlp Đầu vào mẫu được cung cấp có hữu ích cho bạn không?
FUZxxl

Câu trả lời:


1

CJam, 5,6

Đây là một triển khai lại trực tiếp thuật toán trong câu trả lời của orlp . Nếu bạn nêu lên câu trả lời của tôi, hãy chắc chắn rằng bạn cũng nêu lên câu trả lời này . Tôi cũng đề nghị rằng câu trả lời với thuật toán gốc được chấp nhận, bởi vì tôi rất nghi ngờ rằng tôi sẽ tìm ra cách giải quyết vấn đề này một cách tao nhã trong O (n * log (n)).

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

Dùng thử trực tuyến

Đầu vào mẫu:

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

Giải trình:

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.

Bạn có thể thay đổi định dạng đầu ra để phù hợp hơn với ngôn ngữ của bạn. Định dạng chính xác của đầu ra không được chỉ định, chỉ có dữ liệu bạn phải xuất là.
FUZxxl

6

Trăn 2, 11,5

Một môn đánh gôn Python một lần:

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

Tôi thêm một tụ điện 0 pF cho mỗi cái thông thường, không bao giờ cần thêm nữa. Sau đó, chúng tôi sắp xếp các tụ điện và tiếp tục ghép các tụ điện thấp nhất và cao nhất. Nếu tổng nằm trong phạm vi cho phép, chúng tôi sẽ in nó, nếu nó vượt quá phạm vi chúng tôi sẽ loại bỏ mức cao nhất, nếu nó ở dưới mức thấp nhất.

Ví dụ đầu vào / đầu ra:

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

0 90
20 80
30 70
40 60
40 50
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.