如何找到从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是答案。
答案 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
所以这是一个实现这个的小函数:
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;