题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=12
昨天做了一道贪心算法题(见会场安排问题)。今天巩固一下。
如上图所示,对于所有r>h/2的圆,圆周都会与上/下边界有2个交点,例如对于图中左边的圆,可以确定L1=x-√(r^2-(h/2)^2),R1=x+√(r^2-(h/2)^2),若L1<0,则L1=0;若R1>w,则R1=w.
同样,对于右边的圆,则可以确定L2, R2.
这样,对于所有给定的圆中满足r>h/2的,可以算出一个区间集合SI={[L1,R1], [L2,R2], [L3,R3]...[Ln,Rn]}.
需要解决的问题就是怎样使用I中尽量少的区间完全覆盖[0,w].
接下来的思路就类似会场安排问题了,首先将SI中所有元素按照右界下降排序,然后置当前右界Rc=0,计数count=0,然后按照贪心策略:
1) 若SI为空,且Rc<w,算法结束,输出不可覆盖;否则从第一个(右界最大的)开始向后遍历SI
2) 将首先遇到的I从SI中删去,其中I满足L(I)≤Rc
4) count++
3) 置Rc=R(I),若Rc=w,算法结束,输出count. 否则goto 1)