HDU3400 Line belt (幾何+三分)
題目連結:
http://acm.hdu.edu.cn/showproblem.php?pid=3400
題意:
給定兩條平行的路的左右端點的座標。然後給定三個速度求表示在分別在兩條路上的速度和不在路上走的速度
求從點A走到點D的最短時間。
分析:
先假定一個點固定的話 那麼中間肯定有一個點可以使時間最小 然後是一個下凸型函式,
我們可以用三分來求。但是本題的兩個點都不固定,那麼思考一下 我們就可以嘗試用
兩個三分來做,一個三分求一條路上的點,另一個求另外一條路上的點。
注意求距離開方的時候會有精度損失。
程式碼如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
const double eps = 1e-7;
const double ee = 1e-9;
double p,q,r;
struct point{
double x,y;
};
point a,b,c,d,tmp1,tmp2;
double dis(point a,point b)
{
return sqrt(ee+(a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double calu(double t)
{
tmp2.x=d.x+(c.x-d.x)/dis(c,d)*t*q;
tmp2.y=d.y+(c.y-d.y)/dis(c,d)*t*q;
return t + dis(tmp1,tmp2)/r;
}
double sanfen(double t)
{
tmp1.x=a.x+(b.x-a.x)/dis(a,b)*t*p;
tmp1.y=a.y+(b.y-a.y)/dis(a,b)*t*p;
double low=0,high=dis(c,d)/p,ll,rr;
while(high-low>eps){
ll=(low*2+high)/3;
rr=(low+high*2)/3;
if(calu(ll)<calu(rr)) high=rr;
else low=ll;
}
return t+calu(ll);
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
scanf("%lf%lf%lf",&p,&q,&r);
double low = 0, high = dis(a,b)/p,ll,rr;
while(high-low>eps){
ll=(low*2+high)/3;
rr=(low+high*2)/3;
if(sanfen(ll)<sanfen(rr)) high=rr;
else low = ll;
}
printf("%.2lf\n",sanfen(ll));
}
return 0;
}
相關文章
- SGU 124 Broken line(計算幾何)
- 平面幾何
- 39 Three.js線性幾何體材質THREE.LineBasicMaterialJS
- 40 Three.js線性幾何體材質THREE.LineDashedMaterialJS
- 計算幾何
- 計算幾何 —— 二維幾何基礎 —— 距離度量方法
- 計算幾何:模板
- CF18A 幾何
- 美國人的幾何
- 計算幾何模板
- 幾何本質初步猜想
- HDU 6055 Regular polygon(幾何)Go
- [筆記] 計算幾何筆記
- 寵物醫療,成色幾何?
- 二維幾何基礎
- 異構幾何問題
- 幾道經典的幾何作圖趣題
- three.js 幾何體(二)JS
- three.js 幾何體(三)JS
- 幾何庫從零開始
- 【計算幾何】向量表示
- geogebra幾何畫圖工具用法
- 【總結】計算幾何模板
- 二維幾何常用運算
- 二維計算幾何模板
- IV.4 代數幾何
- Points on Cycle (hdu1700,幾何)
- 【計算幾何】線段相交
- Kite(幾何+鏡面對稱)
- 三維計算幾何模板
- 貴國上網速度幾何?
- IT認證價值幾何 (轉)
- Something about 計算幾何
- 論 DevOps 實踐有幾何?dev
- 數學趣題:平面幾何(一)
- 數學趣題:平面幾何(二)
- 俄羅斯總理的幾何題
- 【學習筆記】計算幾何筆記