b
题意: 有一个宽为W的大箱子,和N个宽不一的小箱子,将小箱子都放到大箱子里面,边上可以有空隙,问最低叠放多少层(默认高度一样)
思路:
1.先排序,再在选最大的小箱子,在取剩余宽度,在剩余列表中找有没有剩余宽度的箱子。
- 要循环判断剩余空间
2.队列优先,也是先排序,在最大的放一格,取第二大,看可不可以加到第一格,若不可以再开一格,若可以,则放到第一个,然后要记得加了以后要删去,最后统计有几个格子就是高度
- 判断这个是可以加到哪一格还是新建一格
代码执行的时候一直碰到这个问题,晕不行,后来吧所有注释都删了,然后就可以运行了
def frrr(an,c): #判断an中有没有比求值要小的数
for i in an:
if i <= c:
return i
return 0
for _ in range(int(input())):
height=0
n,w=map(int,input().split())
an=list(map(int,input().split()))
an.sort(reverse=True) #降序
# print(an)
# tmp=0
while len(an)>0:
height+=1
tmp=0
while w - tmp > 0:
c = frrr(an, w - tmp) # 数组中存在比所求值小的数
if c == 0: # 没有那个数了 有空隙
break
else:
tmp += c
an.remove(c)
# print(c, tmp, an)
# print(an)
print(height)
这个是按照思路1做的超时代码,怎么说,就是暴力,然后想到了字典,可以之间遍历小一点的那个数,和方法2有点异曲同工(方法二,还没想好用python怎么写)
for _ in range(int(input())):
n, m = map(int, input().split())
s = [int(i) for i in input().split()]
d = dict()
s.sort(reverse=True)
for i in s:
# 用字典统计每个数有几个,且字典为降序
if i not in d:
d[i] = 1
else:
d[i] += 1
m1 = m
res = 0
# print(d)
while (n > 0): # 当列表里面还有数时
for j in d:
# 用字典,就是按照数值降序遍历一遍
# print('a',j)
while d[j] > 0 and j <= m1:
m1 = m1 - j
d[j] -= 1
# print(m1,j)
n -= 1
m1 = m
res += 1
# print(n)
print(res)
提交一定要把注释删了!!!