首页 > 试题广场 >

汽水瓶

[编程题]汽水瓶
  • 热度指数:494504 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
某商店规定:三个空汽水瓶可以换一瓶汽水,允许向老板借空汽水瓶(但是必须要归还)
小张手上有n个空汽水瓶,她想知道自己最多可以喝到多少瓶汽水。
数据范围:输入的正整数满足

注意:本题存在多组输入。输入的 0 表示输入结束,并不用输出结果。

输入描述:

输入文件最多包含 10 组测试数据,每个数据占一行,仅包含一个正整数 n( 1<=n<=100 ),表示小张手上的空汽水瓶数。n=0 表示输入结束,你的程序不应当处理这一行。



输出描述:

对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

示例1

输入

3
10
81
0

输出

1
5
40

说明

样例 1 解释:用三个空瓶换一瓶汽水,剩一个空瓶无法继续交换
样例 2 解释:用九个空瓶换三瓶汽水,剩四个空瓶再用三个空瓶换一瓶汽水,剩两个空瓶,向老板借一个空瓶再用三个空瓶换一瓶汽水喝完得一个空瓶还给老板    
import sys

max_iter = 10
max_n = 100

iters = 0
for line in sys.stdin:
    iters += 1
    # 超出最大输入行数时退出
    if iters > max_iter:
        break

    n = int(line)
    # 零或非法输入时退出
    if n <= 0&nbs***bsp;n > max_n:
        break

    ans = n//3
    last_n = n%3 + n//3
    while last_n >= 3:
        bot = last_n//3
        ans += bot
        last_n = last_n%3 + bot
    if last_n == 2: # 只需在最后一次考虑是否向老板借瓶子,且只有自己有两个时,才能借得一个
        ans += 1
    print(ans)


编辑于 2024-04-08 22:02:25 回复(0)
每一轮都是上一轮的1/3,
按等比数列求和公式 总数=起始瓶子数*3/2(lmt=1/(1-p)=3/2)
最开始都是空瓶子,所以再减去起始值,小数部分是不够的换一瓶的,最终结果向下取整
print(floor(int(num) * 3 / 2) - int(num))

发表于 2023-08-10 19:47:16 回复(1)
while True:
  try:
    a=int(input())
    if a!=0:
      b=0 #喝到的汽水数
      c=0 #剩余的空瓶数
      d=0 #当前所拥有的空水瓶数
      for d in range(1,a+1):
        c+=1
        if c+1==3:
          b+=1
          c=0
      print(b)
    
  except:
    break


发表于 2022-07-02 16:13:35 回复(1)
递归实现应该是逻辑比较清晰的做法吧
正常做题来讲都是能归纳为典型实现,就按照最标准的来做,规范的实现是一种肃清,也是一种干净
Python的递归实现如下:
def exchange(num):
    if num==2:       #递归边界  两个空瓶能换一瓶
        return 1
    elif num==1:     #递归边界  一个空瓶就算了
        return 0
    else:
        return num//3+exchange(num//3+num%3)    #,超过3时,喝的数量始终是num//3
    
while True:
    try:
        num = eval(input())
        if not num:
            break
        else:
            print(exchange(num))
    except EOFError:
        break



发表于 2021-07-11 00:18:06 回复(0)
不懂acm模式,想问一下这个为啥不通过呀

发表于 2021-07-10 09:50:21 回复(3)
num=10
i=num//3
while num>2:
    num=num//3+num%3
    i += num // 3
print("剩余瓶子数量:",num)
if num==2:
    i=i+1
print("更换了{}瓶汽水".format(i))

发表于 2021-06-19 18:34:35 回复(0)
 
while True:
    try:
        # BottleNum=int(input('输入手上的瓶子数量:'))
        BottleNum=int(input())
        # print('手上的瓶子数量:',BottleNum)
        if BottleNum>0 and (BottleNum*10)%10==0:
            RestBottleNum = int(BottleNum / 3) + BottleNum % 3
            # print('剩余瓶子数量')
            # print(RestBottleNum)
            DrinkCount=int(BottleNum / 3)
            while RestBottleNum>=2:
                if RestBottleNum==2 or RestBottleNum==3:
                    DrinkCount+=1
                    break
                DrinkCount += int(RestBottleNum / 3)
                RestBottleNum = int(RestBottleNum / 3)+RestBottleNum % 3
                # 如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?
            # print('能喝的瓶数:',DrinkCount)
            print(DrinkCount)
        else:
            # print("输入有误,瓶子数量必须是正整数")
            break
    except:
        # print('请检查输入,输入必须为正整数')
        pass

编辑于 2021-05-18 14:01:33 回复(1)
笑死自己了,一开始还按照他喝多少存多少再换多少去写,然后发现,我拿两个空瓶接一瓶喝完然后再还回去,那就只要两个空瓶就可以喝一瓶,好家伙这总数直接除以2就出结果了。这老板亏烂了。
while 1==1:
    N = int(input())
    if N == 0:
        break
    else:
        print(int(N/2))

发表于 2021-04-21 10:30:56 回复(4)
def hsh(n):
    num=0
    while n !=0:
        if n%3==0:
            num+=n//3
            n=n//3
        if n%3==2:
            k=(n+1)//3
            num+=k
            n=k-1
        if n%3 ==1:
            if (n+2)//3<2:
                num+=0
                break
            else:
                k=(n+2)//3
                num+=k
                n=k-2
    print(num)

while True:
    try:
        a=int(input())
        if a !=0:
            hsh(a)
    except:
        break

发表于 2021-04-04 00:57:48 回复(0)
while True:
    num = int(input())
    exchange = 0
    if num == 0:
        break
    else:
        while num > 2.5:
            exchange = exchange + num // 3
            num = num // 3 + num % 3
        if num == 2:
            exchange += 1
        print(exchange)
发表于 2021-03-27 19:11:14 回复(0)
n = []
while True:
    try:
        n.append(int(input()))
    except EOFError:
        break

i = 0
while i < len(n):
    if n[i] != 0:
        print(n[i]//2)
    i += 1

编辑于 2021-03-24 13:37:36 回复(0)
import sys

for i in sys.stdin:
    a = i.split()
    number = (int(a[0]))
    if number == 0:
        continue
    print (number // 2)

用整除可以过
发表于 2021-03-23 19:33:22 回复(0)
while True:
    try:
        n = int(input())
        res1=0
        while n >= 3:
            res1 += n//3
            res2 = n%3 + n//3
            n = res2
            if n ==2:
                res1 +=1
        if res1 != 0:
            print(res1)
    except:
        break
发表于 2021-03-08 17:54:59 回复(0)
while True:
    num = raw_input().strip()
    if int(num) == 0:
        break
    print int(num)//2
发表于 2021-03-03 21:52:49 回复(0)
while True:
    try:
        s=0
        n=int(input())
        if n==0:
            break
        while n>2:
            s+=n//3
            n=n//3+n%3
            if n==2:
                n=3
        print(s)
    except:
        break
发表于 2021-03-02 18:00:13 回复(0)
# python3
import sys
def drink(n):
    if n <2:
        return 0
    elif n==2:
        return 1
    # 喝过的汽水数 -> n//3
    # 剩下的空瓶数 -> n//3 + n%3
    return n//3+drink(n//3+n%3)
for line in sys.stdin:
    n = int(line.strip())
    res =0
    res =drink(n)
    if n != 0:
        print(res)
发表于 2021-02-27 20:06:00 回复(0)
while True:
    try:
        s=int(input())
        if s == 0 : break
        num=0
        while True :
            if int(s/3) == 0 :
                if s == 2 : num += 1
                break
            else :
                num += int(s/3)
                s=int(s/3) + (s%3)
        print(num)
    except:
        break

发表于 2021-02-20 15:24:23 回复(0)
递归(商+余数)
while True:
    try:
        a=int(input())
        if a>0:
            def devide(a):
                if a==2:
                    return 1
                elif a<2:
                    return 0
                else:
                    shang=a//3
                    yu=a%3
                return shang+devide(shang+yu)
            print(devide(a))
        else:
            break
    except:
        break


发表于 2021-02-19 23:51:35 回复(0)

def empty_bottle_for_drinks(num):
    if num == 0:
        return None
    elif num == 1:
        return 0
    elif num == 2:
        return 1
    else:
        drinks = num//3
        num = num//3 + (num - 3*(num//3))
        return drinks + empty_bottle_for_drinks(num)
在pycharm里运行过了都是对的,可是不会封装牛客的输入输出555

发表于 2021-01-28 00:47:50 回复(0)
n = int(input())
while n != 0:
    print(n//2)
    n = int(input())
没有更短的了吧
发表于 2021-01-26 17:18:23 回复(1)