乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市(假設出發時油箱是空的)。給定兩個城市之間的距離d1、汽車油箱的容量c(以公升為單位)、每公升汽油能行駛的距離d2、出發點每公升汽油**p和沿途油站數n(n可以為零),油站i離出發點的距離di、每公升汽油**pi(i=1,2,…,n)。計算結果四捨五入至小數點後兩位。如果無法到達目的地,則輸出「no solution」。
輸入格式:
第一行,d1,c,d2,p,n。
接下來有n行。
第i+1行,兩個數字,油站i離出發點的距離di和每公升汽油**pi。
輸出格式:
所需最小費用,計算結果四捨五入至小數點後兩位。如果無法到達目的地,則輸出「no solution」。
輸入樣例#1:
275.6 11.9 27.4 2.8 2102.0 2.9
220.0 2.2
輸出樣例#1:
26.95分析:在能到達的加油站中內尋找最便宜的加油站,然後判斷是否能一次到達,不能的話先加滿,然後乙個乙個判斷直到剩下的油量不足到下乙個加油站就加油,不用加滿。
remain是當前剩餘的油,cost花費,pos目標站
所有有兩種情況:1.當前站就是pos 再細分兩種情況:
1.從pos就可以走到終點,於是我們把油加到剛好到達終點即可
cost += ((d[i] - d[pos]) / d2 - remain)*p[pos];就得到了最後答案。
2.從pos不能一把走到終點於是,從當前位置走,走到**加油都不如在pos這裡加油划算。所以加滿。
2.當前站點是在pos後面的某個站點,也有兩種情況
1.當前剩餘的油remain不夠走到此站,所以我們把油加來剛好能夠走到此站就行了。(因為這裡便宜!)
2.剩餘的油remain足夠,直接開過去就行了。
1 #include2intn;
3double
d1,d2,c;
4double remain=0,cost=0;5
double p[1010],d[1010];6
intmain()
713 d[n+1] =d1;
14int pos = 0;15
do25
else
//如果剩餘的油不夠
2630 pos =i;
31 flag = true;32
break;33
}34}35
if(!flag)
3645}46
}47while(pos<=n);
48 printf("
%.2lf
",cost);
49return0;
50 }
P1016 旅行家的預算
乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1d1 汽車油箱的容量cc 以公升為單位 每公升汽油能行駛的距離d2d2 出發點每公升汽油 pp和沿途油站數nn nn可以為零 油站ii離出發點的距離didi 每公升汽油 pipi i 1,2,ni...
P1016 旅行家的預算
乙個旅行家想駕駛汽車以最少的費用從乙個城市到另乙個城市 假設出發時油箱是空的 給定兩個城市之間的距離d1 汽車油箱的容量c 以公升為單位 每公升汽油能行駛的距離d2 出發點每公升汽油 p和沿途油站數n n可以為零 油站ii離出發點的距離di 每公升汽油 pi i 1,2,n 計算結果四捨五入至小數點...
P1016 旅行家的預算
h yp erli nk hyperlink hyperl ink de scri ptio ndescription descri ptio n 有乙個人要從乙個地方a aa開車前往另乙個地方b bb,這之間的距離為d1d1 d1車油箱的容量為c cc,每一公升 可以是小數 汽油能使車行駛d2d2...