You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
2.1 KiB
75 lines
2.1 KiB
2 years ago
|
## 空瓶换饮料
|
||
|
### 一、题目描述
|
||
|
某饮料公司最近推出了一个 **空瓶换饮料** 的活动:如果你拥有$3$个空瓶就可以兑换一瓶饮料,初始你有 $n$ 瓶饮料,喝完后的空瓶可以继续用来兑换饮料。问总共可以喝到多少瓶饮料。
|
||
|
|
||
|
**输入格式**
|
||
|
一行,$1$个整数$n$,表示初始饮料的数量($1 <= n <= 10^9$)。
|
||
|
|
||
|
**输出格式**
|
||
|
一行,对应答案
|
||
|
|
||
|
**输入样例**
|
||
|
$10$
|
||
|
|
||
|
**输出样例**
|
||
|
$14$
|
||
|
|
||
|
### 二、解题思路
|
||
|
人工描述测试用例,分析事情的步骤,再思考解决办法:
|
||
|
|
||
|
设 $sum$: 喝掉的总饮料数量
|
||
|
|
||
|
---
|
||
|
- ① 手中有$10$瓶饮料,肯定要先喝掉$sum+=10$
|
||
|
- ② 现在手中空瓶数量$10$,拿$10$个空瓶去换,$10/3=3$,可以换回$3$瓶饮料,剩余$10\%3=1$个空瓶
|
||
|
|
||
|
---
|
||
|
- ③ 手中有$3$瓶饮料,肯定要先喝掉$sum+=3$
|
||
|
- ④ 现在手中空瓶数量$1+3=4$,拿$4$个空瓶去换,$4/3=1$,可以换回$1$瓶饮料,剩余$4\%3=1$个空瓶
|
||
|
|
||
|
---
|
||
|
|
||
|
|
||
|
- ⑤ 手中有$1$瓶饮料,肯定要先喝掉$sum+=1$
|
||
|
|
||
|
- 现在手中空瓶数量$1+1=2$,换不了了,结束
|
||
|
**本质**:换回的数量为$0$时,结束。
|
||
|
|
||
|
#### 总结
|
||
|
- 每轮发生的事情是一样的,可以把每轮的事情组装成一个循环的单元内容
|
||
|
- 每轮的概念:
|
||
|
- 换回的饮料数量 $n=n/3$ (可以直接喝掉)
|
||
|
- 手中空瓶数量 $t=n\%3$
|
||
|
- 对下轮影响:
|
||
|
- 手中的空瓶可以转移到下轮
|
||
|
|
||
|
- 首次
|
||
|
- 首次手中原有的数量,可以视为第$0$轮换回的数量
|
||
|
- 首次手中空瓶的数量,可以视为$0$
|
||
|
|
||
|
### 三、实现代码
|
||
|
```cpp {.line-numbers}
|
||
|
#include <iostream>
|
||
|
using namespace std;
|
||
|
|
||
|
int n; // 换回来的饮料数量
|
||
|
int sum; // 喝到总数
|
||
|
int t; // 空瓶数量
|
||
|
|
||
|
int main() {
|
||
|
cin >> n;
|
||
|
|
||
|
while (n) {
|
||
|
//① 统计上轮结果
|
||
|
sum += n; // 上轮换回来的可以喝到
|
||
|
n += t; // 当前手中酒瓶 = 原空瓶数量+上轮换回
|
||
|
|
||
|
//② 本轮换取开始
|
||
|
t = n % 3; // 剩余空瓶
|
||
|
n /= 3; // 换回来的饮料数量
|
||
|
}
|
||
|
//输出
|
||
|
printf("%d", sum);
|
||
|
return 0;
|
||
|
}
|
||
|
```
|