电影院售票处有很多人排着长队。他们每个人都有一个单一的100,50还是25美元的钞票。
一张电影票25 dollars。
Vasya想把票卖给这条线的每一个人。
如果 Vasya 最初没有钱并严格按照人们排队的顺序出售门票,他能否向每个人出售一张票并找零?
如果瓦夏能把一张票卖给每个人,返回YES,并用他当时手头的钞票找零。否则返回NO。
自己写的代码有些实例带进去对,这两个带进去不对,估计逻辑还是有一些问题请帮我在此基础上改一下
def tickets(people):
c = []
ch = 0
for i in people:
if i == 25:
c.append(i)
ch = sum(c)
if i>25:
ch -= (i-25)
if ch >= 0:
c.append(25)
if ch >= 0:
return "YES"
else:
return "NO"
print(tickets([25, 25, 50, 100]))#"YES"
print(tickets([25, 50, 25, 50, 100, 25, 25, 50]))#"NO"
思路有问题,不能直接用手里钱的总和来计算。
比如你手里只剩两张50,ch为100,再来个50,你总和上算能找开,但你根本没零钱。
改了一下代码
def tickets(people):
dict = {25:0,50:0,100:0}
for i in people:
if i == 25:
dict[25] += 1
elif i == 50:
if (dict[25] == 0):
return "NO"
else:
dict[25]-=1
dict[50]+=1
else:
# 一个很简单的逻辑,当你手里有50元时,只能用来给100找零,所以应该优先50+25
if (dict[25]>0 and dict[50]>0):
dict[25]-=1
dict[50]-=1
# 其实100可以不要,因为100无法被用于找零,这里主要是为了能够显示手里最终有什么样的组合才使用的
dict[100]+=1
elif (dict[25]>=3):
dict[25]-=3
dict[100]+=1
else:
return "NO"
return "YES"
print(tickets([25, 25, 50, 100]))#"YES"
print(tickets([25, 50, 25, 50, 100, 25, 25, 50]))#"NO"
考虑下交换代码的顺序