求從A到D的最短時間。
思路:(看圖)
各兩個三分同時(嵌套)使用。
槽!剛開始圖沒傳上,csdn真難用!
AC代碼:
#include<iostream>
#include<iomanip>
#include<stdlib.h>
#include<string.h>
#include<cmath>
using namespace std;
int P=0, Q=0, R=0;
struct point
{
double x;
double y;
};
double Distance(point a,point b)
{
return sqrt(fabs(pow((a.x - b.x), 2) + pow((a.y - b.y), 2)));
}
double TTime(point a,point b,point c) //第一次三分
{
point left, right, mid, midmid;
left.x = a.x; left.y = a.y;
right.x = b.x; right.y = b.y;
double ans;
while (1)
{
mid.x = (left.x + right.x) / 2;
mid.y = (left.y + right.y) / 2;
midmid.x = (mid.x + right.x) / 2;
midmid.y = (mid.y + right.y) / 2;
double n1 = Distance(midmid, a) / P + Distance(midmid, c) / R;
double n2 = Distance(mid, a) / P + Distance(mid, c) / R;
if (n1-n2 > 0)
{
right.x = midmid.x;
right.y = midmid.y;
}
else
{
left.x = mid.x;
left.y = mid.y;
}
if (fabs(n1-n2) < 0.0001)
{
ans = n1;
break;
}
}
return ans;
}
double calc_time(point a,point b,point c,point d) //第二次三分
{
point left, right, mid, midmid;
left.x = c.x; left.y = c.y;
right.x = d.x; right.y = d.y;
double ans;
while (1)
{
mid.x = (left.x + right.x) / 2;
mid.y = (left.y + right.y) / 2;
midmid.x = (mid.x + right.x) / 2;
midmid.y = (mid.y + right.y) / 2;
double n1 = (Distance(midmid, d) / Q + TTime(a, b, midmid));
double n2 = Distance(mid, d) / Q + TTime(a, b, mid);
if (n1-n2>0)
{
right.x = midmid.x;
right.y = midmid.y;
}
else
{
left.x = mid.x;
left.y = mid.y;
}
if (fabs(n1-n2) < 0.0001)
{
ans = n1;
break;
}
}
return ans;
}
int main()
{
int T;
cin >> T;
while (T--)
{
double Ax, Bx, Ay, By;
double Cx, Cy, Dx, Dy;
cin >> Ax >> Ay >> Bx >> By;
cin >> Cx >> Cy >> Dx >> Dy;
int p, q, r;
cin >> p >> q >> r;
P = p; Q = q; R = r;
point a, b, c, d;
a.x = Ax; a.y = Ay;
b.x = Bx; b.y = By;
c.x = Cx; c.y = Cy;
d.x = Dx; d.y = Dy;
cout <<setprecision(2)<<fixed<< calc_time(a,b,c,d) << endl;
}
system("pause");
return 0;
}
感想:這道題不錯。