Viaky
Hope,is there.

题目大意:在坐标系中给出若干个点的坐标,圆的直径为d且圆的圆心在x轴上,求使用圆的个数最少使得所有点都被覆盖掉。如果无论多少个圆都覆盖不了所有的点,就输出-1.

解题思路:

这题乍看起来真的很像几何啊几何。但事实上跟几何没有多大关系。

圆心在x轴上,给出了每个点的坐标,也就是点到x轴和y轴的距离是已知的。那么我们把当前点的在x轴上的横坐标作为圆心,根据给出的半径可以画出两个大小相同,方向不同三角形,三角形的三边长分别为直径d,到x轴的距离y,以及我们需要求的第三边。根据这个第三边可以确定一个区间。记录这个区间的左端点和右端点,整个问题就变成了用最小的点覆盖所有的区间的问题。

这种问题话说是有很多很多的思路,当然我只大概明白一种。

根据区间的左端点排序,那么区间和区间之间有三种关系:包含、交叉、分离。

考虑第一种情况,l[i]<midr,那么可以用前面区间所用的点来覆盖当前这个区间一部分。但是Minr~r[i]这一段区间是无法用原来区间的点来覆盖的,所以需要将minr更新至r[i]

第二种情况,同样可以用前面区间的点来覆盖当前这个小区间,这里的minr不需要更新.

第三种情况就需要加点来覆盖了,同样minr需要更新到r[i]

初始化ans:=1;每次加点,ans+1即可。

代码略。有要代码的留言联系。

Viaky 原创。请勿copy。

posted on 2011-08-11 18:55  Viaky  阅读(557)  评论(0编辑  收藏  举报