【问题标题】:Cut rod at two points and one piece length greater than L两点截杆,一根长度大于L
【发布时间】:2015-03-03 13:58:25
【问题描述】:

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

  1. 好的一对由 2 个不同的位置组成,在这些位置可以折断棍子。
  2. 当木棍在这两个位置断裂时,至少应有一根长度严格大于 L 的木棍。

现在给定 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.

【问题讨论】:

    标签: algorithm dynamic-programming


    【解决方案1】:

    对你的分数进行排序。

    直觉

    如果一对连续的元素 (i, i + 1) 是有效的切点,因为 A[i + 1] - A[i] &gt; Li + 1i 组合之后的所有点以及 i 之前与 i + 1 组合的所有点也是如此,对于相同原因。

    还为A[i] &gt; LS - A[i + 1] &gt; L 的情况添加一个。

    泛化

    如果两个连续的点不好,那么你需要检查(i, i + 2),然后是(i, i + 3) 等等。为了有效地做到这一点,对于每个i,对它之后的第一个点进行二分搜索就可以了:

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

    所以对大于L + A[i]的最小A[i + k]进行二分搜索。

    【讨论】:

    • @nwellnhof - 我概括了它。
    • @IVlad 如何进行二分搜索?请添加伪代码以使事情清楚
    • @user3840069 - 不,我不会。您一直在问这些问题,并希望每次都能在盘子上提供完整的解决方案。这次我不干了。
    • @IVlad 好的。感谢帮助
    • @IVlad 如果没记错的话,您是在说这样的话:long long ans=0;排序(cutPoints.begin(),cutPoints.end()); for(int i=0;i
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多