Algorithm 在满足特定要求的序列中查找三个数字的组合量

Algorithm 在满足特定要求的序列中查找三个数字的组合量,algorithm,Algorithm,问题是,给定一个数字D和一个数量为N的数字序列,找出三个数字组合中差值最大且不超过值D的数量。例如: D = 3, N = 4 Sequence of numbers: 1 2 3 4 Possible combinations: 1 2 3 (3-1 = 2 <= D), 1 2 4 (4 - 1 = 3 <= D), 1 3 4, 2 3 4. Output: 4 D=3,N=4 编号顺序:1 2 3 4 可能的组合:1 2 3(3-1=2当您在排序列表中查找值范围D中的

问题是,给定一个数字D和一个数量为N的数字序列,找出三个数字组合中差值最大且不超过值D的数量。例如:

D = 3, N = 4
Sequence of numbers: 1 2 3 4

Possible combinations: 1 2 3 (3-1 = 2 <= D), 1 2 4 (4 - 1 = 3 <= D), 1 3 4, 2 3 4.

Output: 4 
D=3,N=4
编号顺序:1 2 3 4

可能的组合:1 2 3(3-1=2当您在排序列表中查找值范围
D
中的项目,并获得索引差
M
,那么您应该计算
C(M,3)

但对于这样的组合数,您不需要使用大的阶乘:

 C(M,3) = M! / (6 * (M-3)!) = M * (M-1) * (M-2) / 6
要进一步减少中间结果,请执行以下操作:

 A = (M - 1) * (M - 2) / 2
 A = (A * M) / 3

当您在排序列表中查找值范围
D
中的项目,并获得索引差
M
时,您应该计算
C(M,3)

但对于这样的组合数,您不需要使用大的阶乘:

 C(M,3) = M! / (6 * (M-3)!) = M * (M-1) * (M-2) / 6
要进一步减少中间结果,请执行以下操作:

 A = (M - 1) * (M - 2) / 2
 A = (A * M) / 3

你没有在你的问题中添加C++标签,所以让我用Python 3写答案(应该很容易翻译成C++):

N=int(输入(“N=”))
D=int(输入(“D=”))
v=[int(输入(“v[{}]=”.format(i)))表示范围(0,N)内的i]
计数=0
i、 j=0,1
当j+1D时:
i+=1
d=j-i
如果d>=2:
count+=(d-1)*d//2#//是整数除法
打印(计数)

>在Timple > <代码> > i>代码>最大距离>代码> J-I= D < /CUD> >代码> V[J] -V[i]

您没有添加C++标记到您的问题,所以让我在Python 3中写答案(应该很容易翻译成C++):

N=int(输入(“N=”))
D=int(输入(“D=”))
v=[int(输入(“v[{}]=”.format(i)))表示范围(0,N)内的i]
计数=0
i、 j=0,1
当j+1D时:
i+=1
d=j-i
如果d>=2:
count+=(d-1)*d//2#//是整数除法
打印(计数)


我们的想法是向上移动三元组的上索引
j
,同时将下索引
i
拖动到最大距离
j-i=d
,其中
v[j]-v[i]欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南,正如您创建此帐户时所建议的。适用于此处。在您发布MCVE代码并准确描述问题之前,我们无法有效帮助您。我们应该能够将您发布的代码粘贴到文本文件中,并复制问题ou描述。链接到非现场代码通常是不可接受的。正如您从给出的答案中所看到的,您还需要澄清您的问题。如何获得溢出?您正在减去两个整数范围内的正值。@Prune嗨,减法不会导致溢出。当我找到t减法的阶乘时wo编号(可以大到10^5-1)是否溢出(我使用结果进行组合)。欢迎使用StackOverflow。请阅读并遵循帮助文档中的发布指南,正如您创建此帐户时所建议的。适用于此处。在您发布MCVE代码并准确描述问题之前,我们无法有效帮助您。我们应该能够将您发布的代码粘贴到文本文件中并重现问题您描述了。链接到非现场代码通常是不可接受的。正如您从给出的答案中看到的,您还需要澄清您的问题。您如何获得溢出?您正在减去两个整数范围内的正值。@Prune Hi,减法不会导致溢出。当我找到两个数字(可能大到10^5-1)会溢出(我使用结果进行组合)。因为N的最大值为10^5,D的最大值为10^9,所以这些数字似乎不仅仅是按顺序排列的整数。否则,D>N是荒谬的。OP给出的示例很弱。嗯,对,我忽略了OP代码中向量的加载:-(@Prune我完全重写了我的答案我明白了。因此,你没有直接计算组合,而是使用了另一种方法来计算组合的数量。嗯……因为N的最大值为10^5,D的最大值为10^9,似乎这些数字不仅仅是按顺序排列的整数。否则,D>N是荒谬的。OP给出的示例很弱。嗯,对,我忽略了OP代码中向量的加载:-(@Prune我完全重写了我的答案,我明白了。因此,你没有直接计算组合,而是使用另一种方法来计算组合的数量。嗯……我明白了……这就是我弄错的地方。因此,我们不必计算分子的阶乘,然后除以分母的阶乘,而是简化了数学模型首先是方程,对吗?就像我们做数学时划掉公数。我明白了……这就是我弄错的地方。所以我们不计算分子的阶乘,然后除以分母的阶乘,而是先简化数学方程,对吗?就像我们做数学时划掉公数一样。