通过总和知道多重集中的重复

时间:2015-02-14 12:35:49

标签: algorithm set

我给出了multiset的大小N及其总和S。集合的元素应该是连续的,例如具有6个(K)元素N=6的多集{1,1,2,2,2,3},所以S=11(多集总是包含第一个{{}} N 1}}重复自然数字。)

如何知道所做的总变化,以便不会重复,并且该集合会变得连续?

对于上面的示例,多集K需要3次更改。因此,最后集合K将变为{1,2,3,4,5,6}

我做的是,我找到了实际的总和(即n*(n+1)/2)并减去了给定的总和。设为T

然后,T=ceil(T/n),然后答案变为2*T,它适用于大多数情况。

但是,我想我错过了一些案例。是否存在一些算法来了解要更改的元素数量?

我只给出了多重集的大小和总和。

1 个答案:

答案 0 :(得分:0)

正如您已经注意到的,对于给定的N,总和应为S' = N * (N-1) / 2。您将获得一些价值S

显然,如果S' = S答案是0。


如果S'- S <= N - 1,那么需要最少更改的多集合就是

{1, 2, ..., N-1, X}

其中X = N - (S' - S),其范围为[1, N-1]。换句话说,X弥补了必需和实际多集之间的总和差异。你的答案是1。


如果差异大于N-1,那么N-1也不能在多重集中。如果S'- S <= (N - 1) + (N - 2),则需要最少更改的多集合是

{1, 2, ..., N-2, 1, X}

其中X = N + (N - 1) - (S'- S),其范围为[1, N-2]。你的答案是2。


概括,你会得到一个像这样的表:

   S' - S    |  answer
-----------------------
[   0,    0] |     0
[   1,  N-1] |     1
[   N, 2N-3] |     2
[2N-2, 3N-6] |     3

等等。您可以找到一个公式来获得NS的答案,但使用简单的循环似乎要容易得多。我会把实现留给你。