思路在于:考虑此前已经操作了n次,而目前还有a个空瓶,计划借c个空瓶。

可以列出以下表格,当(a+c)/3==c时,正好可以还c个空瓶,化简得a=2c。

实际上2c<=a<2(c+1)时,都可以偿还c个空瓶。a=2c(剩0个空瓶)或者a=2c+1(剩1个空瓶)

a	c
2	1
4	2
6	3

每一步,持有a个空瓶,都可以考虑借c个瓶子(0<=c<=a/2)

如果a大于等于3

如果借c个空瓶,得到 (a+c)/3个饮料,喝完得 c+(a-2c)%3+(a-2c)/3 个空瓶。

减去c得(a-2c)%3+(a-2c)/3。

如果不借,总可以把a个空瓶置换成a/3饮料,喝完这些饮料后,得到a%3+a/3个空瓶。(选择借c个瓶子就少了这部分的饮料)

如果a小于等于3

换不了饮料。只能尝试借空瓶,换饮料。

所以当前空瓶数大于等于3时,如果选择借空瓶,得到的饮料一定少于先置换再借。

#include <iostream>
using namespace std;

int main() {
    int a;
    while (cin >> a) { // 注意 while 处理多个 case
    if(a==0)break;
    int cnt =0;
        while(a>=3) {
            cnt+=a/3;
            a = a/3+a%3;
            
        }
        if(a==2)    cnt++;
        cout << cnt<<endl;
    }
}
// 64 位输出请用 printf("%lld")