首页 > 试题广场 >

神奇苹果桶

[编程题]神奇苹果桶
  • 热度指数:352 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
小希在森林冒险的时候发现一个神奇的木桶,某些时候会凭空出现一些苹果。小希很慷慨地跟大家分享了这一个神奇的木桶,让大家都能享用这些大自然的馈赠。为了方便大家来享用,小希对这一神奇的木桶的苹果数量改变进行了记录通知大家,以免在木桶空时让特意过来的人们空手而归。
 小希记录下来的数量改变有3 种:
1.苹果数量凭空增加了 m 个。
2.人们来参观时想要取走 m 个苹果,不过如果此时苹果数量不足m 则放弃此次操作,一个都不取。
3.小希取走 1/m 的苹果进行义卖活动。如果苹果数量不能整除,小希会对其进行向上取整,例如有  10 个苹果时,要拿走 1/4 ,那么小希会拿走 \lceil 10/4 \rceil = 3 个苹果
 小希记得最初时木桶中的苹果数量为 0 ,但她忘记现在苹果数量是多少了,请你帮帮她。

输入描述:
第一行 1 个整数 n ,表示会有n 次操作。
第二行 2n 个整数op_1m_1op_2m_2...op_nm_n ,其中op_i为第i 次的操作类型,m_i为对应参数。意义如题面。
 1 \leq n \leq 50000, 2 \leq m \leq 1000


输出描述:
输出一个整数表示这 n 次操作之后剩余苹果数量。
示例1

输入

5
1 2 2 3 1 5 2 4 3 2

输出

1

说明

第一次操作增加2个苹果。现在剩余2个苹果。
第二次操作尝试拿3个苹果,因为不足3个放弃此次操作。现在仍然剩余2个苹果。
第三次操作增加5个苹果。现在剩余7个苹果。
第四次操作尝试拿4个苹果,足够,拿走后剩余3个苹果。
第五次操作拿走1/2,3不能被2整除,向上取整拿走2个。拿走后剩余1个苹果。
import math

class Apple:
    def __init__(self,number):
        self.number = number

    def apple_add(self,m):
        self.number += m

    def apple_reduce(self,m):
        if self.number >= m:
            self.number -= m

    def apple_sell(self,m):
        if self.number > 0 and m > 0:
            n = math.ceil(self.number/m)
            self.number -= n

n = int(input())
li = list(map(int,input().split()))
apple = Apple(0)
for i in range(n):
    op = li[i*2]
    m = li[i*2+1]
    if op == 1:
        apple.apple_add(m)
    if op == 2:
        apple.apple_reduce(m)
    if op == 3:
        apple.apple_sell(m)
print(apple.number)
发表于 2025-10-09 15:15:44 回复(0)