Skip to content

M30020: 外卖配送

Greedy, http://cs101.openjudge.cn/practice/30020/

小明是一位外卖员,有一天他接到了一个大单,

要送很多披萨(大小5*5)、牛排(大小3*4)、意面(大小2*3)、鸡翅(大小1*2)和可乐(大小1*1),

可是外卖员的后备箱只有6*6的空间,

而且由于包装柔软,物品不能堆叠,且必须按格子放置(长短边方向任意)。

现在小明要摇人来帮忙,请你帮他算算包括小明自己总共需要多少人。

输入

一行五个整数pizza,steak,spaghetti,chickenwings,coke∈[1,1000],五种物件分别的数量。

输出

一行一个整数,包括小明自己最少需要多少人运货。

样例输入

783 943 34 682 39

样例输出

1255

提示

greedy, math

来源

25B13.TA-zdw

【沈俊丞25工院】bitmask做法

python
p55, p43, p23, p12, p11 = map(int,input().split())
cnt = 0
while True:
    if p55 == p43 == p23 == p12 == p11 == 0:  break
    cnt += 1
    pack = [0]*6
    if p55 != 0:
        for i in range(5):
            pack[i] |= 31
        p55 -= 1

        if p12 >= 2:
            p12 -= 2
            for i in range(4):
                pack[i] |= 32
        elif p12 == 1:
            p12 = 0
            for i in (0,1):
                pack[i] |= 32

    if p43 != 0 and pack[0] & 1 == 0:
        for i in range(3):
            pack[i] |= 15
        p43 -= 1
        if p43 != 0:
            for i in range(3,6):
                pack[i] |= 15
            p43 -= 1

    for i in (0,3):
        if p23 == 0: break
        for j in (0,2,4):
            if p23 == 0: break
            if pack[i] & (1 << j) == 0:
                for k in range(3):
                    pack[i+k] |= 3 << j
                p23 -= 1

    for i in range(6):
        if p12 == 0: break
        for j in (0,2,4):
            if p12 == 0: break
            if pack[i] & (1 << j) == 0:
                pack[i] |= 3 << j
                p12 -= 1
    
    for i in range(6):
        if p11 == 0: break
        for j in range(6):
            if p11 == 0: break
            if pack[i] & (1 << j) == 0:
                pack[i] |= (1 << j)
                p11 -= 1
print(cnt)

【马健文 25 元培】

python
from math import ceil
def fill(vacancy,goods):
    filled = min(vacancy,goods)
    vacancy -= filled
    goods -= filled
    return vacancy,goods

a,b,c,d,e = map(int,input().split())
total = 0

# carriers for pizza
total += a
vacancy,d = fill(a*5,d) #1*2 fit in space_11
vacancy,e = fill(vacancy*2+a,e) # 1*1 fit in space 1

# carriers for steak
total += (b+1)//2
vacancy = (b+1)//2*6 - b*2
vacancy,c = fill(vacancy,c)
vacancy,d = fill(vacancy*3,d)
vacancy,e = fill(vacancy*2,e)

# carriers for the remainder
total += ceil((6*c+2*d+1*e)/36)

print(total)