最大总和为1到n的数字,其中和不应该等于给定的整数k

时间:2017-03-25 18:17:58

标签: algorithm

如何找到从1到n的数字的最大总和,但在任何时候,当前总和不应该等于给定的数字k。

这就是我所做的,但它始终不正确。

static int maxMoney(int n, long k) {
    int currentSum = 0;
   for(int i = 1; i <= n; i++){
       currentSum += i;
       if(currentSum == k){
           currentSum -= 1;
           continue;
       }
   }
  return currentSum;  
}
  

约束

   1<= n <= 2 * 10^9
    1<= k <= 4*10^15

所以如果n = 3且k = 3;  如果我们加1 + 2得到3,我们拒绝1并从2开始并做2 + 3得到5。 我们也可以做1 + 3,在这种情况下我们得到值4但是因为我们想要最大值,我们选择5超过4,因此在这种情况下5是答案。

1 个答案:

答案 0 :(得分:2)

首先假设您可以将所有数字相加:sum = 1+2+...+n,可以计算为sum = n(n+1)/2

然后检查1和 n 之间是否有 i ,例如1+2+...+i = k。如果没有,则先前计算的总和就是解决方案。

如果有 i ,则拒绝1,然后返回sum - 1

通过求解以下等式确定这样的 i 是否存在:

k = i(i+1)/2

这个二次方程有这个正解:

i = (sqrt(1+8k) - 1) / 2

如果 i 是一个整数,并且它在 1 ... n 的区间内,那么我们确实找到了这样一个 i 。否则,我们可以得出结论 k 永远不会等于 1 + 2 + ... + i 对于区间 i > 1 ... N

所以这是一个实现这个的小函数:

&#13;
&#13;
function getSum(n, k) {
    var sum, i;
    
    sum = n*(n+1)/2;
    i = (Math.sqrt(1+8*k) - 1) / 2;
    if (i === Math.floor(i) && i <= n)
        sum--;
    return sum;
}

// Sample call
console.log(getSum(3, 3)); // = 5
&#13;
&#13;
&#13;