1715 桶列表(差分)

1. 问题描述:

Farmer John 正在考虑改变他给奶牛分配牛奶桶的方式。他希望使用尽量少的牛奶桶,请帮助他!Farmer John 有 N 头奶牛,编号为 1…N。第 i 头奶牛需要从时刻 si 到时刻 ti 之间挤奶,并且挤奶过程中需要用到 bi 个桶。多头奶牛可能在同一时刻都在挤奶;每个桶在每个时刻只能供一头奶牛使用。也就是说,第 i 头奶牛在时刻 si 到时刻 ti 之间挤奶时,如果用到了某个桶,则该桶在这段时间不能被其他奶牛使用。当然,这个桶在这段时间之外可以被其他奶牛所使用。为了简化他的工作,FJ 保证在任一时刻,至多只有一头奶牛开始或是结束挤奶(也就是说,所有的 si 和 ti 各不相同)。FJ 有一个储藏室,里面有编号为 1、2、3、…… 的桶。在他的挤奶策略中,当某一头奶牛(比如说,奶牛 i)开始挤奶(在时刻 si),FJ 就跑到储藏室取出编号最小的 bi 个桶分配给第 i 头奶牛用来挤奶。请求出 FJ 需要在储藏室中存放多少个桶才能使得他能够顺利地给所有奶牛挤奶。

输入格式

输入的第一行包含 N。以下 N 行,每行描述了一头奶牛,包含三个空格分隔的数 si,ti,bi。其中 si 和 ti 均为 1…1000 之间的整数,bi 为 1…10 之间的整数。

输出格式

输出一个整数,为 FJ 需要的桶的数量。

数据范围

1 ≤ N ≤ 100

输入样例:

3
4 10 1
8 13 3
2 6 2

输出样例:

4
样例解释
在这个例子中,FJ 需要 4 个桶:他用桶 1 和桶 2 来给奶牛 3 挤奶(从时刻 2 开始)。他用桶 3 给奶牛 1 挤奶(从时刻 4 开始)。当奶牛 2 在时刻 8 开始挤奶时,桶 1 和桶 2 可以再次利用,然而桶 3 不可以,所以他会使用桶 1、桶 2 和桶 4。
来源:https://www.acwing.com/problem/content/description/1717/

2. 思路分析:

分析题目可以知道已知若干个区间,每一个区间都有一个权值,我们需要求解出哪一个区间的权值和最大(抽象出模型),所以属于经典的差分问题,由于数据规模在1000以内所以不用离散化处理,由题目可知实际上是区间[l,r - 1]上的所有点加上一个数字,所以在差分的时候是b[l] += 1,b[r - 1 + 1] += 1,并且我们知道差分数组的前缀和就是原数组的值所以我们只需要求解出差分数组的前缀和并且维护前缀和的最大值即可。

3. 代码如下:

class Solution:
    def process(self):
        n = int(input())
        N = 1010
        b = [0] * N
        for i in range(n):
            l, r, c = map(int, input().split())
            # 因为是区间[l, r - 1]加上一个数c, 所以是b[r - 1 + 1]
            b[l] += c
            b[r] -= c
        res = _sum = 0
        for i in range(1, 1001):
            # 差分数组的前缀和就是原数组的值
            _sum += b[i]
            res = max(res, _sum)
        return res


if __name__ == '__main__':
    print(Solution().process())
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值