P17790 [入门赛 #53] 买牛奶 题解

· · 题解

欢迎报名洛谷网校,报名课程可以获得对应组别的知识点讲解与答疑服务,期待和大家一起进步!点击图片即可报名。

:::align{center} :::

我们按日期从早到晚检查,每次根据当天的折扣计算售价。为了方便比较,可以把金额统一换成分:如果当天打 r 折,售价就是 ar/10 元,即 10ar 分;预算则为 100b 分。只要 10ar\leq100b,当天就买得起。由于原价是整数元,折后售价能够精确表示成整数分,不需要使用小数参与比较。

接下来考虑怎样直接算出当天的折扣。第 1、2 天按原价出售,对应 r=10。从第 3 天起,每晚一天就少一折,因此第 day 天的折扣为 r=10-(day-2)=12-day。代码中先令 r=10,再用 if 判断日期是否至少为 3;如果是,就把 r 改为 12-day。这样只用一个变量和条件判断,就能得到六天对应的折扣。

循环依次检查第 1 至第 6 天,遇到第一个买得起的日期就输出并结束。这个日期满足预算限制,更早的日期又都已经检查且不满足,因此它就是最早可购买的日期。前两天售价相同,不可能第 1 天买不起而第 2 天买得起,直接按顺序检查也能正确处理这一点。若六天都买不起,就输出 -1,因为第 7 天开始牛奶已经下架。

最后将以分为单位的售价转成题目要求的格式。用 price/100 得到元的整数部分,用 price\bmod100 得到小数部分,并把小数部分补足两位。代码用 long long 保存金额,计算、比较和输出都不依赖浮点数。