题目大意:在坐标系中给出若干个点的坐标,圆的直径为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。