解题思路:
注意题目最后的提示,拥有两个瓶子时可以找老板借汽水,然后将三个瓶子换的汽水还给老板
把这个过程简单化,就是可以用两个瓶子作为代价去喝一瓶汽水
好的,那我们就不拿三个瓶子去换了,只要一直去借汽水就可以了(老板表示很凎!)
利用借汽水这个机制,每有两个瓶子就可以喝到一瓶汽水
哪岂不是把输入的数除以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; }
0.0分
153 人评分
第二种方式的ans变量放在外边定义,为什么提交的时候显示答案错误啊,可不可以解答一下
CodeRookie 2021-03-03 16:47:48 |
在外面定义时,不要忘了在循环内先初始化 ans = 0 ,应该不会错
曹敏轩 2021-08-13 19:33:46 |
因为每次输进去的数是一个新的数,之前的答案需要清零