/*
本文系「人工智能安全」(微信公众号)原创,转载请联系本文作者(同博客作者)。
欢迎你转发分享至朋友圈,并给予「关注、星标、点赞」三连支持。互相欣赏,互相批判。
我是一名有诗人气质的网络安全工程师
期待与你的思想交流碰撞出智慧的花火
水木清华
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