【力扣每日一题】2023.7.22 柠檬水找零

文章描述了一个编程模拟问题,关于售卖五美元柠檬水并仅接受5、10、20面值钞票的交易。通过分析,提出了一种贪心策略,优先使用10元找零以保留更多的5元钞票用于其他找零需求。代码实现了一个解决方案,检查是否能对所有交易正确找零。
摘要由CSDN通过智能技术生成

目录

题目:

示例:

分析:

代码+运行结果:


题目:

示例:

分析:

这是一道模拟题,我们贩卖五美元(忒贵了)一杯的柠檬水,然后只收取5,10,20面值的钞票,问我们能不能在一开始没有任何零钱的情况下,完成每一笔交易(正确找零)。

这题只需要正常模拟就可以,不过有个小细节,就是如果顾客付了20美元,那么我们需要找15元回去,而这个15元可以由10元和5元组成,也可以是三张5元组成,我们应该怎么选择呢?

首先我们分析一下,如果顾客付的是5元,那么我们不用找零,直接收下。

如果顾客付的是10元,那么我们需要找零5元,也只能找零一张5元,这是没得选的。

而如果顾客付的是20元,那么我们找零15元,可以是10+5,也可以是5+5+5,这是有的选的,操作空间也就在这里了。

我们可以发现,5元是比较“万能”的,它可以找零10元和20元,而10元只能找零20元,所以我们用一点贪心思想,如果顾客付的20元,那么我们优先找零10元,这样可以节省下“万能”的5元用于其他面额的找零。

总结一下就是,如果顾客付5元,我们收下,并记录。如果顾客付10元,我们收下,记录,并将库存的5元数量减一。如果顾客付20元,我们优先找零10元+5元,没有10元的情况下找零三张5元。

代码+运行结果:

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        //moneys[0]表示五元数,moneys[1]表示十元数,因为无法使用二十元找零,因此不用记录二十元数
        vector<int> moneys(2,0);
        for(const int &b:bills){
            if(b==5){
                //收取五元,无需找零
                moneys[0]++;
            }else if(b==10){
                //收取十元,只能用五元找零,没有五元则返回false
                if(moneys[0]==0) return false;
                moneys[0]--;
                moneys[1]++;
            }else{
                //收取20元,如果有十元则优先使用十元找零.
                if(moneys[1]>=1){
                    //使用十元找零还需要一个五元
                    if(moneys[0]>=1){
                        moneys[1]--;
                        moneys[0]--;
                    }else return false;
                }else{
                    //没有十元则需要3张五元
                    if(moneys[0]>=3) moneys[0]-=3;
                    else return false;
                }
            }
        }
        return true;
    }
};

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值