题意
给出一个n,然后我们去1,2,3…的使用n。问做多能多少次(如果最后一次不够的话就不计入结果)
思路
算法1
满足的条件是:k(k+1)2≤n的最大k。本来想二分一下k。然后判断。
但是,从上面那个式子我们可以知道:k(k+1)≤2n。即我们k≤2n−−√≤k+1。于是我们对2n开根号并四舍五入一定能得到k或者k + 1。
最后对k或者k + 1特判一下就好。
算法2
直接根据k(k+1)2=n 解一下方程组就好。
代码
//algorithm1
class Solution {
public:
int arrangeCoins(int n) {
long long x = sqrt(2 * (long long)n);
return (x + 1) * x / 2 <= n ? x : x - 1;
}
};
//algorithm 2
class Solution {
public:
int arrangeCoins(int n) {
return (-1 + sqrt(1 + 8 * (long long)n)) / 2;
}
};

本文探讨了如何解决一个特定的数学问题——给定数量的硬币,最多可以排列成多少个连续整数堆叠。提供了两种算法实现方案,一种通过求平方根逼近解,另一种直接求解二次方程。
&spm=1001.2101.3001.5002&articleId=54988465&d=1&t=3&u=6990b86eea4246c39ec1cfa645828d3b)

被折叠的 条评论
为什么被折叠?



