首页 > 试题广场 >

汽水瓶

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

输入描述:
\hspace{15pt}本题将会给出 1 \leqq T \leqq 10 组测试数据,确切数字未知,您需要一直读入直到特定的结尾;您也可以参考 牛客网在线判题系统使用帮助 获得更多的使用帮助。每组测试数据描述如下:

\hspace{15pt}在一行上输入一个整数 n \left(0 \leqq n \leqq 100\right) ,代表小张手上的空汽水瓶数量。特别地,n=0 代表输入结束,您只需要立即退出,不需要针对这种情况进行处理。


输出描述:
\hspace{15pt}对于每一组测试数据,新起一行。输出一个整数,代表小张最多可以喝到的汽水数量。
示例1

输入

3
10
81
0

输出

1
5
40

说明

\hspace{15pt}对于第一组测试数据,共有 3 个空瓶,可以换 1 瓶汽水。可以证明无法再做任何兑换,因此最多可以喝到 1 瓶汽水。

\hspace{15pt}对于第二组测试数据:
\hspace{23pt}\bullet\,第一轮兑换,共有 10 个空瓶。可以换 3 瓶汽水,余下 1 个空瓶;
\hspace{23pt}\bullet\,第二轮兑换,刚刚余下 1 个空瓶、加上刚刚兑换的 3 瓶汽水喝完,共有 4 个空瓶。可以换 1 瓶汽水,余下 1 个空瓶;
\hspace{23pt}\bullet\,第三轮兑换,刚刚余下 1 个空瓶、加上刚刚兑换的 1 瓶汽水喝完、再找老板借 1 个空瓶,共有 3 个空瓶。可以换 1 瓶汽水,余下 0 个空瓶。喝完之后不要忘记归还借的空瓶。
\hspace{15pt}综上,一共可以喝到 3+1+1=5 瓶汽水。

def soda(n):
    total = 0
    while n > 2:
        exchanged = n // 3
        total += exchanged
        n = n % 3 + exchanged
    if n>1:
        return total+1
    else:
        return total


import sys

lines = []
while True:
    line = sys.stdin.readline().strip()
    if line == '0':
        break 
    lines.append(int(line))
for i in lines:
    print(soda(i))




发表于 2025-02-19 13:41:56 回复(0)
TestNumber=[0]*10 #最多十个数
Cola=0 #能喝的可乐数
#输入空汽水瓶数
for i in range(len(TestNumber)):
    n=int(input())
    TestNumber[i]=n
    if TestNumber[i]==0:
        break

#计算
for i in range(len(TestNumber)):
    #如果初始汽水瓶少于3,就不输出,EnterLoopFlag是标记
    EnterLoopFlag=False
    # 算法
    while TestNumber[i]>=3:
        EnterLoopFlag=True
        Cola+=int(TestNumber[i]/3)
        # 已经喝过的汽水瓶加上之前没换出去的汽水瓶
        TestNumber[i]=int(TestNumber[i]/3)+TestNumber[i]%3
    # 根据规则,如果最后还剩2个空汽水瓶,可以再喝一瓶
    if TestNumber[i]==2:
        Cola+=1
    if EnterLoopFlag==True:
        print(Cola)
    Cola=0




发表于 2024-10-10 16:26:33 回复(0)
pyhton3思路:
try:
    whileTrue:
        request = input()
        ifint(request) == 0:
            exit()
        else:
            response = int(request)//2
            print(response)
except EOFError:
    exit()
发表于 2024-09-03 10:57:55 回复(0)
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)