首页 > 试题广场 >

香槟塔

[编程题]香槟塔
  • 热度指数:3253 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
节日到啦,牛牛和妞妞邀请了好多客人来家里做客。
他们摆出了一座高高的香槟塔,牛牛负责听妞妞指挥,往香槟塔里倒香槟。
香槟塔有个很优雅的视觉效果就是如果这一层的香槟满了,就会从边缘处往下一层流去。
妞妞会发出两种指令,指令一是往第x层塔内倒体积为v的香槟,指令二是询问第k层塔香槟的体积为多少。
告诉你香槟塔每层香槟塔的初始容量,你能帮牛牛快速回答妞妞的询问吗?

输入描述:
第一行为两个整数n,m。表示香槟塔的总层数和指令条数。
第二行为n个整数ai,表示每层香槟塔的初始容量。
第三行到第2+m行有两种输入,一种输入是“2 x v”表示往第x层倒入体积为v的香槟;另一种输入是“1 k”表示询问第k层当前有多少香槟。
1 <= n, m <= 1000。
1 <= n ,m <= 200000,1 <= ai ,v <= 1000000000。


输出描述:
对于每个询问,输出一个整数,表示第k层香槟的容量。
示例1

输入

1 2
8
2 1 9
1 1

输出

8
示例2

输入

5 4
1 2 2 10 1
1 3
2 2 5
2 4 3
1 4

输出

0
4
n, m = list(map(int, input().split(" ")))
tower_empty = list(map(int, input().split(" ")))
tower_full = []
for i in range(n):
    tower_full.append(0)  # 初始每一层香槟含有量均为0
for i in range(m):
    line = list(map(int, input().split(" ")))
    if line[0] == 1:  # 询问香槟量
        print(tower_full[line[1] - 1])  # 第x层下标是x-1
    if line[0] == 2:  # 倒香槟
        x = line[1]
        v = line[2]
        while v > 0 and x <=n:
            diff = tower_empty[x-1] - tower_full[x-1]
            if diff > 0 and diff > v:  # 第x层加不满
                tower_full[x-1] += v
                v = 0
                break
            if diff > 0 and diff <= v:  # 第x层加满了
                tower_full[x-1] = tower_empty[x-1]
                v -= diff
                x += 1
                continue
            if diff == 0:
                x += 1



发表于 2024-05-02 16:45:16 回复(0)