配对电容器


12

电容器因制造公差高而臭名昭著。在许多情况下这是可以接受的,但有时需要具有严格公差的容量。获得具有所需准确值的容量的常见策略是并联使用两个经过仔细测量的电容器,以使它们的容量总计达到所需范围。

在给定(一组)容量的情况下,此挑战的目标是将电容器配对,以使每对电容器的总容量在给定范围内。您还需要找到最佳的配对对,即配对对,以便找到尽可能多的配对。

约束条件

  1. 输入包括选择的格式
    • 容量的无序列表,代表您拥有的(多个)电容器
    • 一对表示的下部和上部的能力结合的的目标范围(包括)
  2. 输入中的所有容量均为小于2 30的正整数,单位为pF(无关紧要)。
  3. 除了输入电容列表之外,您拥有电容器组还包含无限数量的0 pF电容器。
  4. 输出以选择的格式包括容量对列表,以使每对容量之和在指定的目标范围内。既没有指定线对的顺序,也没有指定线对中的容量顺序。
  5. 输出中的任何电容出现的频率都不会比您拥有的一组电容器中出现的频率高。换句话说:输出的对不能重叠。
  6. 满足条件4和5的任何可能输出都不应该包含比程序产生的输出更多的容量对。
  7. 您的程序应在O(n!)时间终止,其中n是代表您拥有电容器组的列表的长度
  8. 不得滥用漏洞
  9. 目标范围,不得为空

计分

您的分数是解决方案的长度(以八位字节为单位)。如果您的解决方案设法在多项式时间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不大,但给人的矛盾。
彼得·泰勒

@orlp提供的样本输入对您有用吗?
FUZxxl 2015年

Answers:


1

果酱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.

您可以更改输出格式,使其更适合您的语言。没有指定输出的确切格式,只有要输出的数据才指定。
2015年

6

Python 2 11.5

一次Python高尔夫:

(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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.