You have a cubic storeroom where the width, length, and height of the room are all equal to n
units. You are asked to place n
boxes in this room where each box is a cube of unit side length. There are however some rules to placing the boxes:
- You can place the boxes anywhere on the floor.
- If box
x
is placed on top of the boxy
, then each side of the four vertical sides of the boxy
must either be adjacent to another box or to a wall.
Given an integer n
, return the minimum possible number of boxes touching the floor.
Example 1:
Input: n = 3 Output: 3 Explanation: The figure above is for the placement of the three boxes. These boxes are placed in the corner of the room, where the corner is on the left side.
Example 2:
Input: n = 4 Output: 3 Explanation: The figure above is for the placement of the four boxes. These boxes are placed in the corner of the room, where the corner is on the left side.
Example 3:
Input: n = 10 Output: 6 Explanation: The figure above is for the placement of the ten boxes. These boxes are placed in the corner of the room, where the corner is on the back side.
Constraints:
1 <= n <= 109
思路:二分底边的数目,然后贪心的排布成1...N的方式,多余的依次添加
class Solution(object):
def minimumBoxes(self, n):
"""
:type n: int
:rtype: int
"""
def ok(bottom):
lo,hi=0,bottom
res = bottom
while lo<=hi:
mid=(lo+hi)//2
if mid*(mid+1)//2<=bottom:
res=mid
lo=mid+1
else:
hi=mid-1
if res > n:
return False
canBuild = 0
for i in range(1,res+1):
canBuild += i*(res-i+1)
left = bottom - res * (1 + res) // 2
canBuild += left*(1+left)//2
return canBuild >= n
lo,hi = 0,n
res = n
while lo<=hi:
mid=(lo+hi)//2
if ok(mid):
res=mid
hi=mid-1
else:
lo=mid+1
return res