題目描述
已知地圖上一共有n個機場,alice要從1號機場飛到n號機場。
從i號機場飛行到j號機場需要消耗dist(i,j)個單位的油量,其中 dist(i,j)為i號機場和j號機場之間的歐幾里得距離。
alice可以選擇在任意機場起降和加油。飛機油箱最多可以儲存u單位的燃油。
考慮到可能遇到的極端天氣,某些機場在某些時候不具備降落的條件。所以出於安全的考慮,當他飛到乙個機場的時候,必須保證飛機剩下的油足以飛到離他最近的機場。
假設一次起飛和降落分別需要花費a秒和b秒的時間,加1單位的油需要花費c秒的時間,飛行1單位的距離需要花費d秒的時間,請問 alice最早什麼時候可以到達終點?
飛機初始的油量為0,也就是說,飛機需要先在起點加油再起飛。
輸入 第一行6個整數n,a,b,c,d,u。
接下來n行,每行兩個整數xi,yi表示第i個機場的座標。
輸出 對於每組資料輸出一行乙個數,表示最早的到達時間,只要你的答案和標準答案相對誤差或者絕對誤差在10
-5以內就算通過
資料保證有解
樣例輸入 copy
4 1 1 1 1 3
1 02 0
3 04 0
樣例輸出 copy
11
題解:粗體部分。
當從第乙個機場起飛。花費為起飛時間+降落時間+加油時間+飛行時間。
飛行時間為兩點的歐幾里得距離。
加油時間由於粗體字可知,為(離目的地最近的那個點的距離+此時兩個點的距離)*c;
當飛出第乙個點外。我們還是需要多加油,但是前面的點我們已經足夠飛到當前點,所以我們的代價位(離目的地最近的那個點的距離+此時兩個點的距離-離起點最近的距離)*c;
注意 double
#pragma gcc optimize(3 , "ofast" , "inline")
#include #define rep(i , a , b) for(register int i=(a);i<=(b);i++)
#define rop(i , a , b) for(register int i=(a);i<(b);i++)
#define per(i , a , b) for(register int i=(a);i>=(b);i--)
#define por(i , a , b) for(register int i=(a);i>(b);i--)
using namespace std;
int n,s;
typedef long long ll;
typedef pairpi;
const int n =1111;
const double eps = 1e-8;
double dist[n];
double dis[n];
pi p[n];
ll inf=ll(1e10);
bool inque[n];
struct edge;
struct youxian
};vectore[n];
void dil()
s=1;
dis[s]=0;
priority_queueq;
q.push();
while(!q.empty()));}}
}}double dd(int x,int y)
int main()
rep (i,1,n) }}
rep(i,2,n) );
}rep(i,2,n) );}}
dil ();
printf ("%f\n",dis[n]);
return 0;
}
BZOJ2763 飛行路線(最短路)
bzoj alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在n個城市設有業務,設這些城市分別標記為0到n 1,一共有m種航線,每種航線連線兩個城市,並且航線有一定的 alice和bob現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。航空公司對他們這次旅行...
BZOJ2763 飛行路線(最短路)
bzoj alice和bob現在要乘飛機旅行,他們選擇了一家相對便宜的航空公司。該航空公司一共在n個城市設有業務,設這些城市分別標記為0到n 1,一共有m種航線,每種航線連線兩個城市,並且航線有一定的 alice和bob現在要從乙個城市沿著航線到達另乙個城市,途中可以進行轉機。航空公司對他們這次旅行...
c 遍歷所有點且距離最短 最短路徑之A 演算法
在求最短路徑問題是,如果去除負權邊的情況,可以使用dijkstra演算法來替代貝爾曼 福特演算法,複雜度更優。接下來介紹的a 演算法,也是一種相對更優的演算法。看下圖 使用dijkstra演算法來計算ab的最短路徑,基本上要把所有的點 邊都遍歷,才能得到最短路徑 綠線。但是站在人類的角度來看,藍線是...