zoukankan      html  css  js  c++  java
  • LeetCode 1739. Building Boxes

    https://leetcode.com/problems/building-boxes/
    题意:在一个边长是n的立方体中放n个方块,方块可以叠加,但是被叠加的在下方的方块八面必须挨着墙或者别的方块。
    问最底部最少可以放多少个方块。

    这是一道找规律的题目,我们可以找出底部方块的个数m和最多可以放n个方块的对应关系。比如
    m=1,n=1
    m=2,n=2
    m=3,n=4
    当底部为3块方块的时候,上一层可以再放一块,一共就是4块
    m=4,n=5
    m=5,n=7
    m=6,n=10
    m=7,n=11
    m=8,n=13

    可以从中找出n的通向公式,给出m可以快速算出n。这样对于题目给出的N我就可以做二分,找出最后一个小于等于N的n对应的m就是答案。

    那么这个通项公式,怎么算呢,很麻烦。可以找下规律,
    1 2 4 5 7 10 11 13 16 20 21 ...
    1 2 1 2 3 1 2 3 4 1 ...
    找到规律,那就开始写代码把。

    class Solution {
    public:
    long long int a[2005];
    long long int b[2005];
    void init()
    {
    	for (long long int i = 1; i <= 2000; i++)
    	{
    		a[i] = (i * (i + 1)) / 2;
            
    		b[i] = (i * (i + 1) * (i + 2)) / 6;
    	}
    }
    int fun2(int x)
    {
    	int l = 1;
    	int r = 2000;
    	while (l <= r)
    	{
    		int mid = (l + r) / 2;
    		if (x > a[mid])
    		{
    			l = mid + 1;
    		}
    		else if (x == a[mid])
    		{
    			return mid;
    		}
    		else
    		{
    			r = mid - 1;
    		}
    	}
    
    	return r;
    }
    int fun(int n)
    {
    	int l = 1;
    	int r = a[2000];
    
    	while (l <= r)
    	{
    		long long int mid = (l + r) / 2;
    		int index = fun2(mid);
    		int m = mid - a[index];
    		long long int y = b[index] + (m * (m + 1 )) / 2;
    
    		if (n > y)
    		{
    			l = mid + 1;
    		}
    		else if (n == y)
    		{
    			return mid;
    		}
    		else
    		{
    			r = mid - 1;
    		}
    	}
    
    	return l;
    
    }
        int minimumBoxes(int n) {
            init();
            return fun(n);
        }
    };
    
  • 相关阅读:
    2019-9-10做题记录
    2019-9-9做题记录
    【HAOI2008】硬币购物
    【SCOI2010】生成字符串
    第18讲——ActiveX控件
    第20讲 HOOK和数据库编程
    第19讲——动态链接库
    2016-5-22 百度之星第三题--瞬间移动
    2016-4-25 完美世界-实习--小萌的包裹
    第3章 拍摄UFO——单一职责原则
  • 原文地址:https://www.cnblogs.com/dacc123/p/14423022.html
Copyright © 2011-2022 走看看