Description
现有许多演讲要在阶梯教室中举行。每一个演讲都可以用唯一的起始和终止时间来确定,如果两个演讲时间有部分或全部重复,那么它们是无法同时在阶级教室中举行的。现在我们想要尽最大可能的利用这个教室,也就是说,我们需要在这些演讲中选择一些不重复的演讲来举行使得他们用的总时间尽可能的长。我们假设在某一演讲结束的瞬间我们就可以立即开始另一个演讲。
读入所有演讲的起始和终止时间,计算最大的可能演讲总时间。
Solution
(DP)题。有挺多方法的。
Sol1
首先有一个最好想的(O(nk))的((k)是最大时间)。
设(dp[t])表示在(t)时间结束,最大的演讲时间。那么
[dp[t]=max{dp[a[i].l]+a[i].r-a[i].l}(if(a[i].rle{t}))
]
Sol2
然后有一个妙妙的(O(n+k))的。
我们用(vector),把每个(ed)存到(a[st])里。
然后(DP)的时候枚举起始时间(st),在枚举对应的结束时间(ed),那么
[dp[st]=max(dp[st-1],dp[st]+ed-st)
]
(因为如果要一个完整的演讲,肯定就只要枚举每个(st)对应的(ed)了。其他不完整的时候,就是(dp[st]=max(dp[st],dp[st-1])))
Sol3
最后还有一个(O(nlog(n)))的二分优化(DP)(其实就是第一个(DP)的优化)
先按结束时间从小到大排序。设(dp[i])表示(DP)到第(i)个演讲时最大的演讲时间。那么
[dp[i]=max(dp[i-1],dp[pos]+a[i].ed-a[i].st)(a[pos].edle{a[i].st})
]
因为(ed)已经有序,而且(dp)数组肯定是单调不降的,所以我们用二分找到满足约束条件的最大的(pos)再更新就可以了