趣味算法------柠檬水摊

目录

题目概述:

解题思路:

具体代码:

总结:


题目概述:

在柠檬水摊上,每个柠檬水售价 5 元。客户正在排队向您购买,并且一次订购一份柠檬水。
每位顾客只会购买一份柠檬水,并支付 5 元、10 元或 20 元的面额。您必须向每位客户提供正确的零钱,以便客户支付 5 元的净交易。

当且仅当您可以为每个客户提供正确的更改时才返回 True 否则返回 False

输入输出格式
输入格式
输入的形式采用字符串的形式例如: 5 5 10 10 20 而 test_str 用于接收这些字符并做后续处理。
输出格式
输出的形式是以字符串的形式如果能成功的找散客人的钱则返回 True 否则 False 。

输入输出样例1
输入
5 5 5 10 20

输出
True
解释
输入的部分表示排队购买柠檬水的客人的金钱面额,如果柠檬水摊能找散这些金额则返回 True 。

输入输出样例2
输入
5 5 10 10 20

输出
False

说明提示
一开始你是没有任何一张钱的,你只能从按照顺序赚取的钱去找散客人。

解题思路:

        这道题的核心思路是贪心算法,对于收银员来说,我们不需要统计目前位置收到的20元钞票,因为一杯柠檬水售价只有5元,而纸钞只有三种,分别是5元,10元,20元。无论如何找零,收银员都用不到20元的钞票,如果客人使用5元纸钞则不需要找零,如果客人使用10元纸钞则需要使用5元纸钞找零,如果客人使用20元纸钞则需要3张5元纸钞或者一张5元纸钞和一张10元纸钞

所以我们只需要分别统计好为每一个客人找零时手上持有的5元和10元纸钞数量。由以上分析可知找零时5元纸钞使用率最高,所以不是没有办法的情况下不要使用5元纸钞。

具体代码:

#include<stdio.h>
int main(void)
{
	int n1 = 0;//5元纸钞的数量
	int n2 = 0;//10元纸钞的数量
	int num;//当前客人手持的钞票
	int flag = 0;
	while (scanf("%d", &num) != EOF)
	{
		if (num == 5)
			n1++;//如果客人带的是5元钞票则5元钞票数量增加1并且不需要找零
		else if (num == 10)
		{
			if (n1 > 0)
			{
				n1--;
				n2++;//如果客人带的是10元钞票则10元钞票数量增加1,找零一张5元纸钞
			}
			else
			{
				flag = 1;//如果没有5元纸钞的话无法找零,退出循环。
				break;
			}

		}
		else
		{
			if (n2 > 0 && n1 > 0)
			{
				n1--;
				n2--;//如果是20元纸钞,并且收银员有10元纸钞和5元纸钞,则用这两种钞票找零
			}
			else if (n1 >= 3)
			{
				n1 -= 3;//如果只有5元钞票并且可以找零,用掉三张5元钞票。
			}
			else
			{
				flag = 1;//如果无法找零退出循环。
				break;
			}
		}
	}

	if (flag)
		printf("False");
	else
		printf("True");
}

总结:

        该题目类型属于贪心算法,贪心算法的本质是通过所有的局部最优解结合来找到全局最优解,可以理解成“能多吞一点是一点”,而我们这道题贪的是5元钞票的数量,不到万不得已,能不用则不用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值