Algorithm 在两点切割杆,且一件长度大于L
我们有一根S厘米长的棍子。它只能在某些位置断开。我们想计算好的对的数量。它满足以下条件Algorithm 在两点切割杆,且一件长度大于L,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我们有一根S厘米长的棍子。它只能在某些位置断开。我们想计算好的对的数量。它满足以下条件 一对好的木棍由两个不同的位置组成,木棍可以在这两个位置断开 当斗杆在这两个位置断裂时,应至少有一个斗杆的长度严格大于L 现在我们得到S,棍子的长度,设为10,棍子可以折断的位置总数N(比如3)。设点为[1,3,9]。让我是5,这里的答案是3 Pair 1 : [1,9] Pair 2 : [1,3] Pair 3 : [3,9] 如果我们切割任何一对,那么它们的长度总是大于L 我只需要数一对。N^2对中的
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.
3对你的观点进行排序
直觉
如果一对连续元素(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]
@nwellnhof-i将其推广。@IVlad如何进行二进制搜索?请添加一个伪代码来制作东西clear@user3840069-不,我不会。您不断地问这些问题,并期望每次都能在盘子上提供完整的解决方案。“这次我不干了。”艾夫拉德:好的。塔克斯help@IVlad如果我没有错的话,你是这样说的:long ans=0;排序(cutPoints.begin()、cutPoints.end());对于(int i=0;i