解题思路:

注意题目最后的提示,拥有两个瓶子时可以找老板借汽水,然后将三个瓶子换的汽水还给老板

把这个过程简单化,就是可以用两个瓶子作为代价去喝一瓶汽水

好的,那我们就不拿三个瓶子去换了,只要一直去借汽水就可以了(老板表示很凎!)

利用借汽水这个机制,每有两个瓶子就可以喝到一瓶汽水

哪岂不是把输入的数除以2再输出就可以了

确实如此!


参考代码:

#include <stdio.h>
  
int main()
{
    int n;                              //定义n为现有空瓶子数
    while (scanf("%d", &n) != EOF && n) //循环输入n
        printf("%d\n", n / 2);          //输出可以喝到的汽水瓶数
    return 0;
}


可能有人会觉得,题目里的意思是最后剩两个瓶子时才能用此机制

但我们仔细想想,如果我们有三个瓶子,拿三个瓶子换一瓶汽水,和拿两个瓶子喝一瓶汽水

就结果来看是一样的,都是喝到一瓶汽水并且剩下一个瓶子

所以将输入直接除以二也并不是没有遵循三瓶换一瓶的模式

而且,如果出题人不写借汽水这个机制,反而不能直接用这种方法了(也可以 (n - 1) / 2 直接得到答案)

或许出题人是有意引导做题者去用简单的方法才加了这个条件呢


当然,传统的写法也不难,

瓶子数大于等于3时拿三个瓶子换一瓶汽水,瓶子数等于2时,先借汽水再换汽水,瓶子清零

对于三瓶换一瓶的模式,我这里就模拟一次性换取多瓶,可以减少循环次数


参考代码:

#include <stdio.h>
  
int main()
{
    int n;                              //定义n为现有空瓶子数
    while (scanf("%d", &n) != EOF && n) //循环输入n
    {
        int ans = 0;                    //定义答案 初始化为0
        while (n >= 2)                  //循环n>=2时可继续换汽水
        {
            if (n >= 3)                 //模式一:n>=3时三个瓶子换一瓶汽水
            {
                int temp = n / 3;       //temp记录当前瓶子可换取的汽水瓶数
                ans += temp;            //答案加上temp
                n = n - temp * 3 + temp;//n减去换汽水消耗的瓶子,再加上新得到的瓶子
            }
            else if (n == 2)            //模式二:两个瓶子可以借汽水再换
            {
                ans++;                  //答案加一
                n = 0;                  //瓶子清零
            }
        }
        printf("%d\n", ans);            //输出答案
    }
    return 0;
}


点赞(2)
 

0.0分

113 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 29 条评论

小白 3年前 回复TA
巨佬
梨花 3年前 回复TA
膜拜大佬
曹敏轩 3年前 回复TA
@星际玩家 因为每次输进去的数是一个新的数,之前的答案需要清零
张麻子 3年前 回复TA
woc 太离谱了 
Pinfaba 3年前 回复TA
我r,离谱且强大
CodeRookie 3年前 回复TA
@星际玩家 在外面定义时,不要忘了在循环内先初始化 ans = 0 ,应该不会错
星际玩家 3年前 回复TA
第二种方式的ans变量放在外边定义,为什么提交的时候显示答案错误啊,可不可以解答一下
しんちゃん 3年前 回复TA
太强了
zqz 3年前 回复TA
虽然自己用传统的方法做出来了,但看到第一种写法,表示很棒!very good!