蓝桥杯 饮料换购 数学推导

题目描述

乐羊羊饮料厂正在举办一次促销优惠活动。
乐羊羊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 }

 

 
posted @ 2020-01-28 12:21  Daybreaking  阅读(796)  评论(0编辑  收藏  举报