藍橋杯 飲料換購 數學推導

題目描述

樂羊羊飲料廠正在舉辦一次促銷優惠活動。
樂羊羊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 }

 

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章