思路在于:考虑此前已经操作了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")