T h e The The B u c k e t Bucket Bucket L i s t List List 题解
题目
题目描述
Farmer John正在考虑改变他给奶牛挤奶的时候分配牛奶桶的方式。他认为这最终能使得他使用数量更少的桶,然而他不清楚具体是多少。请帮助他!
Farmer John有N头奶牛(1≤N≤100),方便起见编号为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需要的桶的数量。
样例输入
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。
解题思路
这道题目的方法是拆分或者暴力,都可以过。
我用的是暴力
+
+
+线段树优化。
- 暴力
我们可以直接把 s s s到 t t t区间的标记加上 b b b,最后只要看最大的那个就行了——因为只有最大的才能符合所有要求。
时间复杂度为 O ( ∑ i = 1 n t i − s i ) O(\sum_{i=1}^{n}{t_i-s_i}) O(∑i=1nti−si),可以过。
注:上面的式子表示所有 t i − s i t_i-s_i ti−si的和。 - 暴力
+
+
+线段树
我们可以用线段树来维护区间的最大值,从而把时间复杂度降到 O ( n log 1000 2 ) O(n\log_{1000}^{2}) O(nlog10002),大概是 O ( 10 n ) O(10n) O(10n),可以过。
不会线段树的可以自己学一下。 - 拆分
直接将 s − 1 s-1 s−1和 t t t都标记一下,最后用前缀和来处理。
时间复杂度为 O ( n ) O(n) O(n)。