【模拟·习题】[USACO18JAN]Lifeguards S

这篇博客介绍了USACO竞赛中的一道题目——Lifeguards S,讨论了解雇一名救生员后仍能覆盖的最大时间段。文章详细讲解了线段覆盖问题的解题思路,强调了处理线段间关系的重要性,并提供了相应的代码实现。
摘要由CSDN通过智能技术生成

Problem

题意翻译
FJ为他的奶牛们建造了一个游泳池,FJ认为这将有助于他们放松身心以及生产更多牛奶。

为了确保奶牛们的安全,FJ雇佣了N头牛,作为泳池的救生员,每一个救生员在一天内都会有一定的事情,并且这些事情都会覆盖一天内的一段时间。为了简单起见,泳池从时间t=0时开门,直到时间t=1000000000关门,所以每个事情都可以用两个整数来描述,给出奶牛救生员开始以及结束事情的时间。例如,一个救生员在时间t=4时开始事情并且在时间t=7时结束事情,那么这件事情就覆盖了3个单位时间。(注意:结束时间是“点”的时间)

不幸的是,FJ多雇佣了一名的救生员,但他没有足够的资金来雇佣这些救生员。因此他必须解雇一名救生员,求可以覆盖剩余救生员的轮班时间的最大总量是多少?如果当时至少有一名救生员的事情已经开始,则这个时段被覆盖。

输入格式

输入的第一行包括一个整数N(1≤N≤100000)。接下来N行中,每行告诉了我们一个救生员在0~10000000000范围内的开始以及结束时间。所有的结束时间都是不同的。不同的救生员的事情覆盖的时间可能会重叠。

输出格式

如果FJ解雇一名救生员仍能覆盖的最大时间。

Solution

线段覆盖类题型的常见思路就是根据左端点,从小到大进行。

如果有一个点,被其它的若干个线段覆盖,即它覆盖的区间也被其它的区间覆盖过,则这个区间一定作废,即最后输出所有区间覆盖的大小即可。

若不存在上述情况,我们需要通过线段之间的覆盖关系来查找究竟应该删除哪一个线段。

显然,删除的点一定是单独覆盖的点尽可能小,这个才能使总结果减少的尽量小,这样才能够保证结果最优。

在循环枚举的第i条线段,可以具体这么操作:

  • 如果它不与前面的线段重合,对最后答案的贡献一定是 R [ i ] − L [ i ] R[i]-L[i] R[i]L[i] ;否则对答案的贡献是 R [ i ] − l a s t , l a s t R[i]-last,last R[i]last,la
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值