裸奔 的傻瓜
在通往Ac的路上 蹒跚踱步

题目来源:http://acm.pku.edu.cn/JudgeOnline/problem?id=1727

 这个题目用到了排序和二分查找,贪心。

题意是现有许多点,然后再用小于给定数目的点按照规则覆盖原先所有的点,使创建的点中的最小的t最大。

先观察覆盖公式:t2>=t1+|x2-x1|,现在知道t2,x2求尽量大的t1。则我们可以枚举t1的值,只要x1存在,则表示这个新创建的点可以覆盖到(t2,x2)。所以我的想法是,从大到小枚举每一个可能的t1,对于每个t1求出覆盖至少需要创建多少个点。如果满足条件则得出答案,否则t1减少1。

对于每个t1求至少多少个点的问题,可以用贪心思路。对所有现有点按x排序。从左至右,对于每个(t2,x2),得出x1的范围。t1-t2+x2<=x1<=t2-t1+x2。逐步缩小x1的范围,当x1不可能存在的时候,表示需要创建一个新点。这样就可以确认某个t1是否合适的问题。

现在的问题就是枚举t1了,此时可以二分查找来做。先确定上限(肯定是所有现有点中t的最小值),下限为一个很大的负数,(我取的是-4000001,注意题目中的t的范围只是现有点的范围,这里wr了很几次。)然后就很自然的得出一个结果。

代码:

Code

posted on 2008-10-22 16:21  Lyt  阅读(345)  评论(0编辑  收藏  举报