乐羊羊饮料厂正在举办一次促销优惠活动。乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去(但不允许暂借或赊账)。
请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么,对于他初始买入的 n 瓶饮料,最后他一共能喝到多少瓶饮料。
输入格式
输入一个整数 nn,表示初始买入的饮料数量。
输出格式
输出一个整数,表示一共能够喝到的饮料数量。
数据范围
0<n<10000
输入样例1:
100
输出样例1:
149
输入样例2:
101
输出样例2:
151
______________________________________________________________________________________________________
资源约定:
峰值内存消耗(含虚拟机) < 256M
CPU消耗 < 1000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
______________________________________________________________________________________________________
思路: 简单模拟一下,就发现规律啦
文字解释:
假设开始时有10瓶饮料,每瓶饮料可以得到一个瓶盖。那么一开始有10瓶饮料。
先喝掉这10瓶饮料,得到10个瓶盖,此时手上有10个瓶盖。n = 10
将这10个瓶盖兑换成3瓶饮料(n/3),剩下1个瓶盖(n%3),再将这3瓶饮料喝掉,得到3个瓶盖,此时手上总共有4个瓶盖。(n/3+n%3)
将这4个瓶盖兑换成1瓶饮料,剩下1个瓶盖。再将这1瓶饮料喝掉,得到1个瓶盖,此时手上有2个瓶盖。(换不了了!)
式子提取:
以 10 瓶为例子,设n为一开始买入的瓶子,m为可以直接换取的,x为换之后剩余的瓶子
① n = 10, m = 10/3 = 3 x = 1
② n = 3 + 1 = 4 ,m = 4/3 = 1 x = 1
③因为现在手上还有的瓶盖数目为1 + 1 < 3因此,可以换取的总数目就是 **m总 = 3 + 1 = 4**
变成规律很容易看出来
变成n、m、x的式子: m总 += n/3, n = n / 3 + n%3 (换取的瓶子可以产生1个瓶盖,加上换取后剩下的瓶盖,变成新的n)
画图:

代码部分:
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,m = 0,x = 0; //定义变量n为初始饮料数量,m为最多可以喝到的饮料数量,x暂未使用
cin >> n; //输入初始饮料数量
m = n; //将初始饮料数量加入最多可以喝到的饮料数量中,因为最初买入的饮料可以直接喝
while(n >= 3) //只有当剩余的饮料数量大于等于3时才进行兑换
{
m += n/3; //计算可以直接兑换得到的饮料数量,加入最多可以喝到的饮料数量中
n = n/3 + n%3; //计算喝掉的饮料数量,加上剩余的瓶盖数量和空瓶子数量,作为下一轮的初始饮料数量
}
cout<<m; //输出最多可以喝到的饮料数量
return 0;
}