UVA303 Pipe 题解
这题真被坑惨了。
解法
枚举所有拐点的上下端点(但是显然选同一处拐点的上下端点是没有意义的),然后使我们求的直线穿过这两个点,暴力验证直线是否可以穿过管道或者求最远到达的距离。
为什么选端点可以保证答案最大化?
我们称两个拐点之间的那段管道为一段管道,显然一段管道的上下两边的斜率是相同的,而且是单调的。我们分类讨论。
- 如果这段管道是单调递减的(斜率为负),显然我们可以让光线尽可能靠近下拐点以增大答案。
- 如果这段管道是单调递增的(斜率为正),显然我们可以让光线尽可能靠近上拐点以增大答案。
综上,靠近端点能使答案最大化。
接下来就是喜闻乐见的判断直线与线段是否相交以及求交点坐标。
判断线段相交的做法还是用向量判断。计算交点我们详细解释。
为了方便讲解,我们将直线上任取两点和线段两端点这四个点分别记作 A , B , C , D A,B,C,D A,B,C,D。
如图,设直线与线段交点为 E E E。
根据小学四年级(雾)学的燕尾模型, A E E B = S Δ A D C S Δ B D C \dfrac{AE}{EB}=\dfrac{S_{\Delta ADC}}{S_{\Delta BDC}} EBAE=SΔBDCSΔADC,所以 A E A B = S Δ A D C S Δ A D C + S Δ B D C \dfrac{AE}{AB}=\dfrac{S_{\Delta ADC}}{S_{\Delta ADC}+S_{\Delta BDC}} ABAE=S