有一个立方体房间,其长度、宽度和高度都等于 n 个单位。请你在房间里放置 n 个盒子,每个盒子都是一个单位边长的立方体。放置规则如下:
你可以把盒子放在地板上的任何地方。
如果盒子 x 需要放置在盒子 y 的顶部,那么盒子 y 竖直的四个侧面都 必须 与另一个盒子或墙相邻。
给你一个整数 n ,返回接触地面的盒子的 最少 可能数量。
示例 1:
输入:n = 3
输出:3
解释:上图是 3 个盒子的摆放位置。
这些盒子放在房间的一角,对应左侧位置。
示例 2:
输入:n = 4
输出:3
解释:上图是 3 个盒子的摆放位置。
这些盒子放在房间的一角,对应左侧位置。
示例 3:
输入:n = 10
输出:6
解释:上图是 10 个盒子的摆放位置。
这些盒子放在房间的一角,对应后方位置。
提示:
1 <= n <= 10e9
基本思路:首先,为了地面单元格尽量少,我们应该靠在一个角落堆积单元格,以使顶部可以放尽量多的单元格。我们可以先写出几个例子,容易发现,每层的单元格的个数为(i+1)*i/2;假设有k层,且每一层都填满,那么从底部往上,每一层的单元格的个数是,(k+1)*k/2,(k-1)*k)/2,...(1+1)*1/2,据此,我们可以找到对于数字n,满足条件的大于k层,但是小于k+1层的模型
举个例子:以第一层的单元格为3为例开始,逐渐增加单元格的情况,其中,每个单元格上的数字,代表层数(该位置上单元格的最多个数)
1 1 -> 1 1 ->1 1 -> 3 2 1
1 1 2 1 2 1
1 1 1
对比上图,我们可以发现, 从下往上,底部每添加一个单元格时,顶部可以添加的单元格数目从0->k-1个。
int minimumBoxes(int n) {
int level=1;
int cell=0;
while(cell+level*(level+1)/2<n){
cell+=level*(level+1)/2;
level++;
}
level--;
int area=(level+1)*level/2;
int add=0;
while(cell<n){
area++;
cell+=add+1;
add++;
}
return area;
}