【bzoj4426】最大生产率 题解

题目大意

       有 n 个工人,每个工人的工作时间为 l[i]…r[i]。
       你要把工人分成 p 个组,每个组的贡献是该组工人的 min(r)-max(l),即工作时间的交集。
       你的分组要保证每组的贡献是正数,且每个人都要有分组。
       求最大总贡献。
       p<=n<=1000(原题是 200), l, r<=1e6, 保证有解。

题解

       看到这个首先想到把工人按时间排个序,然后发现连续一段分一组好像是坠吼的??
       如果出现一个工人包含了另一个工人的情况,这样就错了。

       所以要把工人分成两类,一类是不包含任何其它工人的,一类是会包含其他工人的。
       那么第一类工人按时间排序之后,连续一段分一组就最优了。讲道理这就是个简单dp了,用四边形不等式可以优化到 n^2,这个跟 poj1160 差不多。
       讲道理第二类工人本来也应该这样dp一下的,但是。。。首先这类人不满足连续一段分一组最优的性质,其次他们贪心就行了。。。一个人独占一组肯定是最优的,因此这一类人按工作时长排序,从大到小选就好了,选不到的就相当于把他扔到第一类去找他包含的那组。
       (这也可以理解为什么第一类人不能贪心,因为他们选不到的不能被扔到别的地方去)

       最后就是枚举两类人各分成多少组就行了。

代码

//略
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值