python - 为什么我在 codewars python 中遇到问题?
问题描述
问题:
新的“复仇者联盟”电影刚刚上映!电影院售票处有很多人排着长队。他们每个人都有一张 100、50 或 25 美元的钞票。“复仇者联盟”的票价为 25 美元。
Vasya 目前是一名文员。他想把一张票卖给这条线上的每个人。
如果 Vasya 最初没有钱并且严格按照人们排队的顺序出售门票,是否可以向每个人出售一张票并找零?
返回 YES,如果 Vasya 可以向每个人出售一张票并用他当时手头的账单找零。否则返回 NO。
例子:
tickets([25, 25, 50]) # => YES
tickets([25, 100]) # => NO. Vasya will not have enough money to give change to 100 dollars
tickets([25, 25, 50, 50, 100]) # => NO. Vasya will not have the right bills to give 75 dollars of change (you can't make two bills of 25 from one of 50)
我的代码:
def tickets(people):
money = 0
for ticket in people:
if ticket == 25:
money += ticket
else:
if money >= ticket - 25:
money += 25
money -= ticket - 25
else:
return "NO"
return "YES"
我有 4 个错误:“YES 应该等于 NO”和“NO 应该等于 YES”
我的错误在哪里?
解决方案
您应该跟踪库存中每种票据的数量,而不仅仅是您拥有的总金额。为此,您可以使用 dict (或者collections.OrderedDict
,如果您使用的是 3.6 之前的 Python 版本)将每个票据值映射到您库存中的票据数量,从最大的票据到最小的票据。对于来自客户的每张票据投标,目标变化将是票据价值减去 25。然后遍历 dict 键并从目标变化和库存中扣除该类型票据的数量以满足目标变化,或您的库存数量,以较小者为准。如果遍历所有库存票据后目标变化仍然不为零,则表示您无法满足所需的目标变化,因此返回'NO'
; 否则将当前票据投标添加到库存中。'YES'
如果您能够满足所有客户,则最终返回。
from collections import OrderedDict
def tickets(people):
stock = OrderedDict.fromkeys((100, 50, 25), 0)
for tender in people:
change = tender - 25
for bill, count in stock.items():
deduct = min(change // bill, count)
change -= deduct * bill
stock[bill] -= deduct
if change:
return 'NO'
stock[tender] += 1
return 'YES'
推荐阅读
- firebase - firebase 规则:获取集合的所有 id
- ffmpeg - 使用 libav 混合可流式分段 mp4
- java - 登录后 Spring-webflow SnapshotCreationException 错误
- excel - 检查单个单元格中是否存在一系列值中的任何值
- javascript - [0] 在过滤器方法的末尾传递了什么?
- c - 结构声明中的结构动态数组
- ssh - git clone: CONNECT_CR_SRVR_HELLO: 错误的版本号
- oracle - Oracle Database Setup.exe 文件在解压到 Windows 上的文件夹后未执行
- android - 如何在下载通知中添加类似 Chrome 的剩余时间文本
- excel - 将一个页面上的单元格链接到不同工作表上的另一个单元格的公式?