leetcode LCP 32. 批量处理任务(贪心+二分)

题目链接

解题思路
容易想到贪心思路,按照区间右值从小到大,将任务排序。然后依次处理每个任务,每次优先选择区间最右边的时间来处理任务,这样可使选择的时间尽量的被后面的区间包含,使能多次利用的时间尽量的多,使总时间最少。

接下来看具体到每个任务的细节如何处理?
对于每一个任务,首先查看这个任务的区间内包含多少已使用的时间,如何计算这个值?
容易发现,前面选择使用的时间区间,一定是由某些不相交的时间段组成,我们可以维护前面选择的时间段,由于这些时间段一定是升序排列,所以我们可以二分查找当前的区间包含哪些已选择的区间,我们可以维护已选择区间的前缀和,进而可以O(1)计算出当前包含区间的和。

我们计算出本区间包含多少个以前选择的区间后,如果已包含的时间不够本区间使用,怎么计算本区间应该最少使用多少时间?
我们可以二分答案,二分本区间使用多少时间,求出本区间最少使用多少时间。

求出本区间使用的时间段以后,如何维护我们前面需要维护的已选择时间段及其前缀和?
三种情况,分类讨论:
1,如果新时间段不和前面的时间段相交,之间加到末尾即可。
2,如果新时间段包含前面的时间段,删除老的时间段即可,显然我们一定是从末尾开始删除,所以我们可以O(1)删除一个时间段
3,如果新时间段与老时间段相交,合并两个时间段即可。
由于最多总共n个时间段,每个时间段只会从末尾添加或者删除,只会添加或者删除一次&

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值