欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 美食 > 趣味算法------柠檬水摊

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

2025/4/19 9:12:25 来源:https://blog.csdn.net/markingyi/article/details/141471082  浏览:    关键词:趣味算法------柠檬水摊

目录

题目概述:

解题思路:

具体代码:

总结:


题目概述:

在柠檬水摊上,每个柠檬水售价 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");elseprintf("True");
}

总结:

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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词