一维装箱


 

商品规格为长为n,高为1,可以平放。有一个一位数组,每个值大于0表示高出地面,小于0表示低于地面,等于0表示地平面(可以理解为坑坑洼洼高高低低)

输入第一行:n,表示货品长度;第二行:m,表示数组长度;第三行:依次数组的值

例如

 如果装的商品长为2:

那么只能装两个 ,最终结果就是输出能装下的商品数量。

解析

如上图例子中所示,我们首先要找坑,找到坑以后还要看一下坑大小能不能塞下商品(坑宽度),然后看下能塞几个(坑深度),这个因素可以使我们避免陷入如下紫色的深坑中去寻找(商品宽度为2,没有意义的寻找,因为坑宽度本身就不合适了)

输入

2
4
0,-1,-2,0

输出:

1

输入

3
8
0,-1,-2,2,1,1,1,2

输出:

0

这里还有一个优化是,如果深度一样,一下可以下降多层

 1 n = int(input())
 2 m = int(input())
 3 arr = list(map(int, input().split(',')))
 4 arr.append(0) #最后一位存能装下的货品数量
 5 def find(i,j,h):
 6     while i<=j:
 7         if arr[i]<h:
 8             for k in range(i, j+1): # j+1
 9                 if arr[k]>=h:
10                     t = h - max(arr[i], arr[k-1]) #下降的高度差
11                     temp = ((k-i)//n)*t
12                     if temp>0:
13                         find(i, k, h-t) #下降(h-t)米
14                     arr[-1] += temp
15                     i = k
16                     break
17         else:
18             i += 1
19 find(0,m,0)
20 print(arr[-1])