1. 程式人生 > >P1016 旅行家的預算

P1016 旅行家的預算

最小 之間 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 旅行家的預算