Math 生成一个和特定数相加的序列所需的最小元素数
假设有个数s=12,现在我想用元素a1+a2+…+an=12进行排序 准则如下:-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
因此,如何找到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.