P1016 旅行家的預算
阿新 • • 發佈:2017-05-25
最小 之間 rdquo pos div for 格式 sca 足夠
P1016 旅行家的預算
題目描述
一個旅行家想駕駛汽車以最少的費用從一個城市到另一個城市(假設出發時油箱是空的)。給定兩個城市之間的距離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 2 102.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 #include<cstdio> 2 int n; 3 double d1,d2,c; 4 double remain=0,cost=0; 5 double p[1010],d[1010]; 6 int main() 7 { 8 scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&p[0],&n); 9 for(int i=1;i<=n;++i) 10 { 11 scanf("%lf%lf",&d[i],&p[i]); 12} 13 d[n+1] = d1; 14 int pos = 0; 15 do{ 16 bool flag = false; //判斷能不能到達 17 for (int i=pos+1;i<=n+1&&d[i]<=d[pos]+c*d2;i++) //判斷加滿油能不能到達下一個加油站 18 { 19 if(p[i]<p[pos]) //找更便宜的加油站 20 { 21 if(d[pos]+remain*d2>=d[i]) //如果剩余的油足夠,就開過去 22 { 23 remain -= (d[i]-d[pos])/d2;//油量將減少從一個站點到下一個站點用到的油 24 } 25 else //如果剩余的油不夠 26 { 27 cost+=((d[i]-d[pos])/d2-remain)*p[pos]; //還需要加的油花費的價錢,不用加滿 28 remain = 0; //到達下一個站點時沒油了,所以剩余汽油量清0 29 } 30 pos = i; 31 flag = true; 32 break; 33 } 34 } 35 if(!flag) 36 { 37 cost += (c-remain)*p[pos]; //不能到達前花費了多少錢 38 remain = c-(d[pos+1]-d[pos])/d2; //還剩多少油 39 if (remain>=0) pos++; //小於0,油根本不夠到達下一個站點,大於0,代表可以去下一個加油站 40 else 41 { 42 printf("No Solution"); 43 return 0; 44 } 45 } 46 } 47 while(pos<=n); 48 printf("%.2lf",cost); 49 return 0; 50 }
P1016 旅行家的預算