使序列与特定数字相加所需的最小元素数

时间:2011-09-30 11:38:12

标签: math

假设有数字s = 12,现在我想用元素a1 + a2 + ..... + an = 12来制作序列。

  

标准如下 -

     
      
  1. n必须是最小的。
  2.   
  3. a1和a必须为1;
  4.   
  5. ai可以将a(i-1)与1,0和-1不同。
  6.   

对于s = 12,结果为6.

那么如何找到n的最小值。

5 个答案:

答案 0 :(得分:3)

从给定n中查找s的算法:

1 .Find q = FLOOR( SQRT(s-1) )

2 .Find r = q^2 + q

3 。如果s <= r然后n = 2q,则n = 2q + 1


示例:s = 12

  1. q = FLOOR( SQRT(12-1) ) = FLOOR(SQRT(11) = 3
  2. r = 3^2 + 3 = 12
  3. 12 <= 12,因此n = 2*3 = 6
  4. 示例:s = 160

    1. q = FLOOR( SQRT(160-1) ) = FLOOR(SQRT(159) = 12
    2. r = 12^2 + 12 = 156
    3. 159 > 156,因此n = 2*12 + 1 = 25
    4. 的25个数字序列
      159:    1,2,3,4,5,6,7,8,9,10,10,10,9,10,10,10,9,8,7,6,5,4,3,2,1
      

答案 1 :(得分:2)

这是一种可视化解决方案的方法。

首先,将具有大于或等于星数的最小三角形(包含成功奇数星的行)绘制为n。在这种情况下,我们绘制一个16星三角形。

   *
  ***
 *****
*******

然后我们必须移除16 - 12 = 4个更多的星星。我们从顶部开始对角地进行此操作。

   1
  **2
 ****3
******4

结果是:

  **
 ****
******

最后,将列高加起来得到最终答案:

1, 2, 3, 3, 2, 1

答案 2 :(得分:0)

任何给定系列长度n的最大可能性是:

n是偶数=&gt; (N ^ 2 + 2N)/ 4 n是奇数=&gt;第(n + 1)^ 2/4

通过查看系列的简单算术和,可以很容易地得到这两个结果,在n的情况下,它甚至是系列1 ... n / 2之和的两倍。在n奇数的情况下,它是系列1 ...(n-1)/ 2的总和的两倍,并加上n + 1/2(中间元素)。

显然,只要n> 3,您就可以生成任何小于此最大值的正数。

因此,问题就是找到最大的n,其最大值大于目标值。

算法上我会选择:

查找(sqrt(4 * s)-1)并向上舍入到下一个奇数。调用此M.这是一个易于计算的值,将代表最低的奇数n将起作用。

检查M-1以查看其最大总和是否大于s。如果是这样,那么你的n是M-1。否则你的n就是M.

答案 3 :(得分:0)

有两种情况:s奇数和s偶数。当s为奇数时,你有序列:

1,2,3,...,(s-1)/ 2,(s-1)/ 2,(s-1)/ 2-1,(s-1)/ 2-2,.... ..,1

当你甚至有:

1,2,3,...,s / 2,s / 2-1,s / 2-2,...,1

答案 4 :(得分:0)

谢谢大家回答我。我推导出一个更简单的解决方案该算法看起来像 -

First find what is the maximum  sum that can be made using n element-

if n=1 ->    1            sum=1;
if n=2 ->    1,1          sum=2;
if n=3 ->    1,2,1        sum=4;
if n=4 ->    1,2,2,1      sum=6;
if n=5 ->    1,2,3,2,1    sum=9;
if n=6 ->    1,2,3,3,2,1  sum=12;


So from observation it is clear that form any number,n  9<n<=12 can be 
made using  6 element, similarly number 
6<n<=9  can be made at using 5 element.
So it require only a binary search to find the number of
 element that make a particular number.