蓝桥杯 饮料换购 数学推导

题目描述

乐羊羊饮料厂正在举办一次促销优惠活动。
乐羊羊C型饮料,凭3个瓶盖能够再换一瓶C型饮料,而且能够一直循环下去(但不容许暂借或赊帐)。
请你计算一下,若是小明不浪费瓶盖,尽可能地参加活动。
那么,对于他初始买入的n瓶饮料,最后他一共能喝到多少瓶饮料。 

输入

输入存在多组测试数据
每组测试数据输入一行包含一个正整数n(1<=n<=10000)

输出

对于每组数据输出一行,包含一个整数,表示实际获得的饮料数

样例输入 Copy

100
101

样例输出 Copy

149
151




每三瓶能够兑换一瓶,也就是每次减三后必需要加一。所以其实是每两瓶能够使得答案加一。
可是有一种特殊状况,即当饮料数为2的时候,此时没法兑换,须要特判。

根据乘法的性质:
奇数 * 奇数 = 奇数
偶数 * 奇数 = 偶数

也就是说,若是一开始有奇数瓶饮料x,根据每三换一的规则,若x是3的倍数,那么兑换一次后仍然是奇数瓶;若不是3的倍数,那么 x % 3 + x / 3 也是奇数。因此无需特判,答案为 x + x / 2。

若是一开始是偶数瓶饮料x, 根据兑换规则,若x是3的倍数,那么兑换一次后仍然是偶数瓶;若不是3的倍数,那么 x % 3 + x / 3 也是偶数。这样偶数瓶饮料不停的兑换,最后必定会小于3,根据前面推出的性质,最后的数必定是偶数,所以是2。
须要特判,答案为 x + x / 2 - 1.

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<algorithm>
 6 using namespace std;
 7 
 8 int main()
 9 {
10     int n;
11     while(scanf("%d", &n) != EOF)
12     {
13         if(n == 0)
14             printf("0\n");
15         else
16         {
17             int t = n / 2;
18             if(n % 2 == 1)
19                 printf("%d\n", n + t);
20             if(n % 2 == 0)
21                 printf("%d\n", n + t - 1);
22         }
23 
24     }
25     return 0;
26 }
相关文章
相关标签/搜索