LeetCode 1739. 放置盒子(推公式)

LeetCode 1739. 放置盒子(推公式)_第1张图片
思路:
最终一定是按照下面这样排列,方格上的数字代表这个位置可以垒多高。

图1
LeetCode 1739. 放置盒子(推公式)_第2张图片

图2
LeetCode 1739. 放置盒子(推公式)_第3张图片
所以假设底面放的数目为 m i d mid mid
先按照 ( N + 1 ) ∗ N / 2 = m i d (N+1)*N/2=mid (N+1)N/2=mid算出N,也就是图一中的梯形图的高度。
那么结果就是 ∑ i = 1 N ( i + 1 ) ∗ i 2 \sum_{i=1}^N\frac{(i+1)*i}{2} i=1N2(i+1)i
还剩下一部分是 n u m 2 = m i d − ( N + 1 ) ∗ N / 2 num2=mid-(N+1)*N/2 num2=mid(N+1)N/2,这一部分填在梯形图外围,如图二所示。最终贡献就是 ( n u m 2 + 1 ) ∗ n u m 2 2 \frac{(num2+1)*num2}{2} 2(num2+1)num2

typedef long long ll;
class Solution {
     
public:
    int cal(int x) {
     
        return 1ll * (1ll * x * (x + 1) * (2 * x + 1) + 1ll * (1 + x) * x * 3) / 12;
    }
    bool check(int n,int mid) {
     
        int N = (-1 + sqrt(1 + 8 * mid)) / 2;
        int m = (1 + N) * N / 2;
        int num2 = (mid - m + 1) * (mid - m) / 2;
        int num = cal(N) + num2;
        return num >= n;
    }
    int minimumBoxes(int n) {
     
        int l = 1,r = min(1650467,n);
        int ans = min(n,1650467);
        while(l <= r) {
     
            int mid = (l + r) >> 1;
            if(check(n,mid)) {
     
                ans = mid;
                r = mid - 1;
            } else {
     
                l = mid + 1;
            }
        }
        return ans;
    }
};

你可能感兴趣的:(#,leetcode,ACM_数学,TDMTDMTDMTDM)