Math 生成一个和特定数相加的序列所需的最小元素数

Math 生成一个和特定数相加的序列所需的最小元素数,math,Math,假设有个数s=12,现在我想用元素a1+a2+…+an=12进行排序 准则如下:- n必须是最小值 a1和an必须为1 ai只能将a(i-1)相差1,0和-1 对于s=12,结果为6 因此,如何找到n的最小值。任何给定长度n序列的最大可能值为: n为偶数=>(n^2+2n)/4 n为奇数=>(n+1)^2/4 这两个结果很容易通过观察简单的数列算术和得到,在n偶数的情况下,它是数列1…n/2之和的两倍。在n奇数的情况下,它是系列1…(n-1)/2和n+1/2(中间元素)之和的两倍 很明显,只要n

假设有个数s=12,现在我想用元素a1+a2+…+an=12进行排序

准则如下:-

  • n必须是最小值
  • a1和an必须为1
  • ai只能将a(i-1)相差1,0和-1
  • 对于s=12,结果为6


    因此,如何找到n的最小值。

    任何给定长度n序列的最大可能值为:

    n为偶数=>(n^2+2n)/4 n为奇数=>(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。

    有两种情况:s奇数和s偶数。当s为奇数时,您有以下顺序:

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

    当n为偶数时,您有:


    1,2,3,…,s/2,s/2-1,s/2-2,…,1

    以下是一种可视化解决方案的方法

    首先,画一个最小的三角形(包含奇数个星星的行),该三角形的星星数大于或等于n。在这种情况下,我们画一个16星三角形

       *
      ***
     *****
    *******
    
    然后我们必须删除更多的星星。我们从顶部开始沿对角线进行此操作

       1
      **2
     ****3
    ******4
    
    结果是:

      **
     ****
    ******
    
    最后,将柱高度相加,得到最终答案:


    1,2,3,3,2,1
    从给定的
    s
    中查找
    n
    的算法:

    1。查找
    q=FLOOR(SQRT(s-1))

    2。查找
    r=q^2+q


    3。如果
    s谢谢您的回答。我得出了一个更简单的解决方案。算法看起来像-

    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. 
    
    首先找出使用n元素可以得到的最大和是多少-
    如果n=1->1和=1;
    如果n=2->1,则1和=2;
    如果n=3->1,2,1和=4;
    如果n=4->1,2,2,1和=6;
    如果n=5->1,2,3,2,1和=9;
    如果n=6->1,2,3,3,2,1和=12;
    
    因此,从观察中可以清楚地看出,对于任何数字,n9这更像是一个数学问题,而不是一个编程问题。如果
    s
    介于
    q^2+1
    q^2+q
    之间,则最小值为
    n=2q
    。如果
    s
    介于
    q^2+q+1
    (q+1)^2
    之间,您的最小
    n=2q+1
    。您确定需要6个元素才能获得12个元素吗?我可以在5分钟内拿到它:
    1234
    。还是我遗漏了什么?jpalecek:
    an
    必须是1。我希望最佳顺序是
    1232 1
    @jpalecek是的,你错过了一件事a1和an必须是1。我知道,但如何找到n的值。视觉效果很好,但如果s=123452,我认为你不想使用这种方法这是否意味着s通常会很小?举例来说,我不会认为这是一个很好的解决方案,可以解决数百万的s值。如果有一个限制s是小的,你应该在原始问题中包含这类信息,因为它对你得到的答案有很大的影响。FWIW上面的几个答案是基于上述理论的,但没有查找表,只是使用一点代数根据最大和找到n的正确值。它能够轻松地处理一个大数字,就像当n只有100000时,最大和可以达到250005000(一个大数字32位数字)。它还可以处理更大的数,而且它的运行时间也很好,因为不需要像sqrt()这样昂贵的浮点操作。它只需要O(lgn)二进制搜索,我更认为拥有一个查找表可能并不实用。我想你的桌子大概有8兆,这在大计划中并不多,但对于一个查找对象来说,它感觉相当多。此外,我还假设此查找表是硬编码的,而不是每次使用时进行计算。我想我唯一的其他评论是,我不会说这是一个算法,它只是一个查找。这些通常都很好,但您确实将问题标记为算法。:)是的,如果只有一个查询,那么它是不必要的,但是对于大量的查询,比如说需要数千个/百万个查询。我还能为这个问题贴上什么标签???好的,我可以把它标记为math,但是它还需要生成一个模式,检查/观察模式的正确性。这不是一种算法吗???我会说这真的是数学。如果您想要一个算法来生成查找表,那么这就是算法,但我假设它足够简单,不需要。在查找表中查找某个内容的一个步骤绝对不应该被称为算法。
    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.