我们有一个S厘米长的棍子。它只能在某些位置被打破。我们想要计算GOOD对的数量。它满足以下条件
现在我们给了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.
答案 0 :(得分:0)
对你的积分进行排序。
<强>直觉强>
如果一对连续元素(i, i + 1)
是有效的分割点,因为A[i + 1] - A[i] > L
那么i + 1
与i
结合后的所有分数和i
之前的分数都是如此出于同样的原因,与i + 1
结合使用。
还为案例A[i] > L
和S - 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]
。