题解【Topcoder SRM 580】EelAndRabbit
题目大意:给定n个区间,求这些区间能覆盖最多的一点的次数
或者说,任意取两个个i,如果i在一段区间以内sum就加一,求sum的最大值
解法:首先看这道题,假如兔子的坐标是0的话,那么当T-t[i]=0时兔子就可以抓到鳗鱼了,一旦鳗鱼坐标超过了T-t[i]-l[i]=0兔子就抓不到了,所以我们得出,一条鳗鱼可以被兔子抓住的时间段在(t[i],t[i]+l[i])之间
于是问题就转化成了题目大意里的问题,这是我们思考一个问题,如果按照最朴素的枚举想法来解题,时间复杂度大概是多少?由于需要枚举每个时刻,而是刻的值又非常大,所以显然这个复杂度是难以接受的。
如何缩减枚举的时间复杂度呢?我们要尽可能的减少冗余运算。考虑一个覆盖后的区间,假设有这样的一组数据:
1 4
2 3
1 3
2 4
那么,区间(2,3)可以被四个区间所覆盖,这意味着兔子在第2分钟抓鱼可以抓到四个,是最优解,或者说,只要让兔子在这个子区间内出手抓鱼就一定是最优解,我们发现,子区间的开头一定是由一个题目给定的区间的开头构成,所以我们只需要枚举每个题目给定区间的开头然后计算在这种情况下能被多少个区间覆盖取最优值就可以了
题目里说可以出手抓两次,那么就可以开一个循环先枚举第一次什么时候出手,然后计算能抓到的鱼的数量,在枚举第二次什么时候出手,抓鱼数量取最优值与第一次的抓鱼数量相加,最后打擂台去最终的最大值就可以了
这里需要注意一下,两次出手不能抓同一条鱼,所以可以每次枚举第一条鱼的时候就开一个数组记录这次抓到了哪几条鱼,第二次枚举的时候避开这些鱼就可以了
代码: