你好呀,我是灰小猿,一个超会写bug的程序猿!
欢迎大家关注我的专栏“每日蓝桥”,该专栏的主要作用是和大家分享近几年蓝桥杯省赛及决赛等真题,解析其中存在的算法思想、数据结构等内容,帮助大家学习到更多的知识和技术!
标题:饮料换购
乐洋洋饮料厂正常举行一次促销优惠活动,乐洋洋C型饮料,凭3个瓶盖可以再换购一瓶C型饮料,并且可以一直循环下去,(但是不允许暂借或者赊账)
请你计算一下,如果小明不浪费瓶盖,尽情的参加活动,那么对于他初始买入的n瓶饮料,最后他一共能喝到多少瓶饮料?
输入:一个正整数n,表示最初购买的饮料数量。(0<n<10000)
输出:一个整数,表示实际得到的饮料数
例如:
用户输入:
100
程序应该输出:
149
用户输入:
101
程序应该输出:
151
请严格按要求输出,请不要打印类似于“请您输入...”相关的多余文字
所有源码放置在同一个文件中,调试过后,拷贝提交该源码
解题思路:
本题在求解时有两种思路可以参考:
第一种是常规思路:
当我们现在有n瓶饮料的时候,也就是有n个瓶盖,我们计算当前手上的瓶盖可以换取多少瓶饮料,同时还剩多少个瓶盖,把换取的饮料数加上刚才换取后剩余的瓶盖数,就是当前手上有的瓶盖数,那么就又回到了问题最开始的情形,进行递归即可,并将每次换取的新的饮料数累加即可,当手上的瓶盖数小于3个时,不能再进行换购了,那么将最后剩余的瓶盖数加上,即得到最终答案。
第二种思路:
设我们现在有n瓶饮料,记录喝了多少瓶饮料,我们知道每喝三瓶饮料,就可以得到一瓶饮料,那么等于是喝了三瓶饮料,但是剩余没喝的饮料数少了两瓶,利用循环,当剩余的没喝的饮料数小于三时,就不能换购了,这时在用已经喝了的饮料数加剩余的饮料数就是最终答案。
具体的代码解析如下:
答案源码:
第一种解法:
public class Year2015_Bt8 { static int ans = 0; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); ans = n; f(n); System.out.println(ans); } private static void f(int n) { if (n<3) { return ; } int sum = n/3; n = sum + n%3; ans += sum; f(n); } }
第二种解法:
import java.util.Scanner; public class Year2015_Bt8_2 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); int ans = 0; while (n>=3) { n-=2; ans+=3; } ans+=n; System.out.println(ans); } }
输出样例: