在两个点处切割杆并且一个长度大于L.

时间:2015-03-03 13:58:26

标签: algorithm dynamic-programming

我们有一个S厘米长的棍子。它只能在某些位置被打破。我们想要计算GOOD对的数量。它满足以下条件

  1. 一对好的一对由2个不同的位置组成,其中棍子可以被打破。
  2. 当棒在这两个位置断裂时,应该至少有一根长度严格大于L的棒。
  3. 现在我们给了S,棍子的长度让它为10,总数没有。棒可以被打破的位置N(比如说3)。让点为[1,3,9]。让L为5,然后这里答案是3

    Pair 1 : [1,9] 
    Pair 2 : [1,3]
    Pair 3 : [3,9]
    

    如果我们切断任何一对,那么它们的长度总是大于L。

    我只需要算对。我们不能去N ^ 2对中的每一对。我认为他们必须采用一些DP方法。请帮助解决这个问题

    约束

    3<=S<=5*10^4
    2<=N<= MIN(S-1,10^4)
    0<=L<=S-1
    All Array element are distinct and 1<=A[i]<=S-1.
    

1 个答案:

答案 0 :(得分:0)

对你的积分进行排序。

<强>直觉

如果一对连续元素(i, i + 1)是有效的分割点,因为A[i + 1] - A[i] > L那么i + 1i结合后的所有分数和i之前的分数都是如此出于同样的原因,与i + 1结合使用。

还为案例A[i] > LS - A[i + 1] > L添加一个。

<强>概括

如果两个连续点不好,那么您需要检查(i, i + 2),然后(i, i + 3)等。为了有效地执行此操作,对于每个i,二进制搜索之后的第一点是好的:

A[i + k] - A[i] > L
=>
A[i + k] > L + A[i]

因此二进制搜索大于A[i + k]的最小L + A[i]