/* 本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。 欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。 我是一名有诗人气质的网络安全工程师 期待与你的思想交流碰撞出智慧的花火 水木清华 2020-03-13 汽水瓶 */ #include<iostream> using namespace std; //最多可喝的汽水瓶数的函数接口 int Soda_Bottle_Num(int num) { int sum = 0; //计数器,最多可以喝的汽水瓶数 int count = 0; //计数器。每一次空瓶换汽水操作可以喝到的汽水瓶数 // 空汽水瓶数小于或等于 1 时,无法喝到汽水,也无法通过“先借后还”方式喝到汽水 if (num <= 1) { sum += 0; } // 空汽水瓶数大于或等于 2 时,至少可以喝到一瓶汽水,如通过“先借后还”方式就可以喝到汽水 while (num >= 2) { num += 1; //只要手上的空汽水瓶数大于或等于2,不论情况如何,先借一个空汽水瓶 count = num / 3; //一次空汽水瓶换汽水操作后可以喝到的汽水瓶数(3 个空汽水瓶换 1 瓶汽水,喝它!) num = num % 3 + count - 1; //剩下的空汽水瓶数,包括之前没换的空汽水瓶 + 喝完汽水后的空汽水瓶 + 要还回去空汽水瓶(之前借了一个空汽水瓶); sum += count; //累计可以喝到的汽水瓶数 } return sum; //返回最多可以喝的汽水瓶数 } //主函数 int main() { int n; while(cin >> n) //输入测试数据 { if(n != 0) { cout << Soda_Bottle_Num(n) << endl; //输出结果 } } return 0; } //更简单的方法:注意到每两个空汽水瓶就可以通过借一个空汽水瓶来喝到一瓶汽水,故最多可以喝到的汽水瓶数等于空汽水瓶数除以二,即 sum = num / 2