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

空瓶换饮料

一、题目描述

某饮料公司最近推出了一个 空瓶换饮料 的活动:如果你拥有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;
}