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)