题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2795
题意:给你一个高为h,宽为w的板子,以及n个高为1,宽度为wi的公告,如果板子能放下这个公告的话,尽可能将这个公告往上往左放,公告只能横着贴,贴在一行里,如果放不下就输出-1,如果放得下,就输出在板子上所放置的公告的高度(也就是行数)。
思路:将板子每个高度的宽度设为线段树叶子节点的值(也就是说叶子节点的值代表每行的空位的个数),将线段树存放区间和的数组sum[]的值用来表示其两个儿子节点之间的最大值(目的在于引导搜寻的方向),在线段树的递归过程中,总是先往左边递归,也就是说,会先往上方进行寻找,如果左右节点的空位都满足的话,会优先往左边搜寻,直到到达叶子节点,说明已经搜到了能放下这个公告的行数,将此行的值减去这个公告的宽度,输出所在行数,结束递归,同时更新区间和的值。
值得注意的是,此题的高度是10^9,以10^9建立数组会爆内存,但是题目中给出的公告的数量是2^5,每个公告都有确定的宽度,如果一行放不下的话就都放不下,如果能放得下的话,每个公告最多占一行,所以说板子的高度只要有2^5就足够了,在板子的高度超过2^5的时候,只需要让板子的高度为n就ok了,没超过2^5的时候,就照题目来。
1 #include
2 #include
3 #include
4 #include
5 #include