题目 :http://acm.hdu.edu.cn/showproblem.php?pid=3400
题目大意 :求从线段AB顶点A到线段CD顶点D的最少时间,其中在AB上的速度为P,
在CD上的速度为D,在其它地方的速度为R。
算法 :三分法
思路 :设时间为t,AB上某点K1,CD上某点K2,则路径是A->K1->K2->D(没必要在空平面内走折线)假定我们知道最短时间下的AB上的点是K1,这问题便成为了在CD上找一点,使得总最小。我们设这点为(x,y)由于速度都是常数,则有:(式中除x,y都是常数)
Time = |AK1|/P + sqrt( (x – k1.x)^2 + (y – K2.x)^2 ) + sqrt( (x – D.x)^2 + (y – D.y)^2) 可简化为
Z = (x – a)^2 + (y - b) ^2 + C, 是抛物面,其中一条弧是单峰函数。同理,K1的确定因为类似。可用三分法。 (证明不很严谨,只为安慰自己)
值得注意的一点是精度如何控制。一开始用的是while(len(left ,right) > ESP),用的是三分区间的左右断点进行的判断,wa了无数次,最后听杨大牛说,“求什么,就应该用什么作为进度的约束条件,而不应该是左右区间,有可能左右区间的进度的在1e-6,而通过这个算出来的最小时间在1e-2级别,这样解就错了。应此切记,求什么就用什么作为精度控制。
AC code
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define ESP 1E-5
struct POINT{
} A, B, C, D;
int P, Q, R;
POINT Get_Mid(POINT PL, POINT PR){
}
doublelen(POINT p1, POINT p2){
}
double Get_Min_Time(POINT pt){
}
int main(){
}