题解 | 汽水瓶

汽水瓶

https://www.nowcoder.com/practice/fe298c55694f4ed39e256170ff2c205f

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


全部评论

相关推荐

12-20 11:21
复旦大学 Java
点赞 评论 收藏
分享
想进开水团喝开水:哦 给我一个 就算你真拿到牛友也会为你开心的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务