题目描述
小明喜欢喝瓶装牛奶,今日超市有优惠活动,牛奶5元1瓶,每2个瓶盖外加1元可以换1瓶,如果小明在不赊账不借别人瓶盖的情况下,想喝N瓶牛奶,至少要花多少元钱?
解答要求
时间限制:1000ms, 内存限制:256MB
输入
输入整数N(0<=N<=10^8),代表N瓶牛奶
输出
输出整数代表最少要花费的钱数。
样例
输入样例 1
2
输出样例 1
10
输入样例 2
3
输出样例 2
11
输入样例 3
5
输出样例 3
17
经验(C++)
1.题目中给出了参数范围,面对参数范围,要对10^9 这个数字敏感,在 0-10^9 之间的数,用int作为数据类型即可,对于超出的情况,应当选择long long数据类型,要注意,long int 也是32位的,必须使用long long 作为数据类型。当题目中数据范围明确在可能等于10^9的情况下,要注意在运算以及运算的临时结果中,其结果是否可能越界,是否需要使用64位的类型进行保存,或者是否需要将变量都转为double进行运算,在运算完毕时转换回来。
2.当选择用long long 作为数据类型后,如果在主函数之外另写函数,应当注意函数入参,不要惯性地使用int而导致传参错误,该类错误不容易自检,应当从源头注意写法或使用工具检查。
3.该题目的考核点为编程实现,除了简单的数学解题方法之外,应当同时掌握其他方法解答,如二分法,递归等手段。在练习时可是尝试用多种算法实现,在实际的考试中也许只有一种解法可以通过,应当扩展自己的解题思路,而不是在运用数学解法简单破解之后就放弃使用复杂算法去实现。
4.数学解法:在购买一瓶之后,每购买X - 1瓶即可喝到X瓶,最终需要购买1 + (N - 1) / X * (X - 1) + (N - ( N - 1)/ X * X - 1) 瓶,最终花费 5+ ((N - 1) / X ) * ((X - 1) * 5 + 1) + 5 * (N - ( N - 1 ) / X *X - 1)元。
5.二分法解题思路:购买瓶数M为变化数,求得全部换购完喝到的瓶数为K,通过二分法可以求得购买的瓶数,剩余的都是换购的,购买的5元一瓶,换购的1元一瓶,价格就比较好求了。