[爬山算法] [BZOJ5041] LWD的降临

来源:互联网 发布:mac pro win10性能 编辑:程序博客网 时间:2024/04/30 11:14

题目传送门
2017.9.15 水 UOJ 裙的时候 onepointo 童鞋说这道题没人水……于是看了看……
其实就是求一个椭圆与给定圆外切的切点坐标,这个椭圆不是标准椭圆(即主轴为 x 轴)。
如果我们暴力列方程的话有如下几个方程:
切点在圆上;
切点在椭圆上;
该点处圆的切线与椭圆的切线相同。
按理说是可求的,可是切点未知,解方程很难……
问题出在并不知道切点(也不会求切线……),观察到精度要求很低,可以想到等分圆周,判断每个点为切点的情况。
怎么判断切点……不是切线不会求吗……
观察到如果该点为切点,形成的椭圆长轴长应该是最短的,类比一下两个圆的位置关系可以理解到这一点。
然后就有判断依据咯……等分圆周然后找一个 a 最小的点就是答案……
那天晚上A了……可是出题人认为暴力太简单加强了数据……等分圆周就T了(其实是WA?)
于是改进这个等分圆周的策略……

出题人:这个距离函数长得跟正弦函数差不多

???蛤?

证明:感性理解

???蛤?
这样的话爬山就可以了……复杂度玄学
可是模拟退火不仅比爬山慢而且精度比爬山低得多……不知道为什么……
纪念写的第一份爬山,并写出了倒数的速度……(感谢Claris……(大雾))
UPD:退役之后想了想,还是感觉证明很麻烦。
下面说说成果吧……劳资推了两个晚自习了QAQ
先转化一下坐标系,让原点位于两焦点中点,两焦点连线位于 x 轴上,这个可以通过坐标变换公式来完成,计算完成之后再移回去即可。
下面是坐标变换公式:
设平面直角坐标系 Oxy,OxyO 点在 Oxy 坐标系下坐标为 (x0,y0),由 x 轴转到 x 轴转过角度为 θM 点在 Oxy 坐标系下坐标为 (x,y),在 Oxy 坐标系下坐标为 (x,y),则满足关系:

{x=xcosθ+ysinθx0y=ycosθxsinθy0

这样就可以得到一个标准椭圆了。
联立:
{b2x2+a2y2=a2b2(xm)2+(yn)2=r2

于是得到了一个非常复杂的一元四次方程,注意不要将 y2 开根号,需要讨论正负,正确的方法是移项并将其平方。
然后根据盛金公式,令这个方程有四重根就好了。
没算,留坑不补了(真的太恶心了……)
换种方法?
椭圆上一点的切线可以这样作:令 P 为椭圆上一点,分别连接该点与左右焦点 F1,F2,则 F1PF2 的角分线的垂线为 P 点处切线。
也就是说,圆心与 P 点连线所在直线平分 F1PF2。不过这个还得等分圆周……
没什么好做法了,不如上知乎问个问题QAQ。
假题害人啊QAQ
Code

原创粉丝点击