codeforces1498 B - Box Fitting python

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)

提交一定要把注释删了!!!

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值