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.
2.1 KiB
2.1 KiB
空瓶换饮料
一、题目描述
某饮料公司最近推出了一个 空瓶换饮料 的活动:如果你拥有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
三、实现代码
- 首次手中原有的数量,可以视为第
#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;
}