首页 > 解决方案 > 为什么我在 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”
我的错误在哪里?

标签: python

解决方案


您应该跟踪库存中每种票据的数量,而不仅仅是您拥有的总金额。为此,您可以使用 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'

推荐阅读