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

p1016旅行家的預算

else operator fine names nbsp code bre col urn

  

題目描述

一個旅行家想駕駛汽車以最少的費用從一個城市到另一個城市(假設出發時油箱是空的)。給定兩個城市之間的距離 D1D1 、汽車油箱的容量 CC (以升為單位)、每升汽油能行駛的距離 D2D2 、出發點每升汽油價格 PP 和沿途油站數 NN ( NN 可以為零),油站 ii 離出發點的距離 DiDi 、每升汽油價格 PiPi ( i=1,2,…,Ni=1,2,,N )。計算結果四舍五入至小數點後兩位。如果無法到達目的地,則輸出“No Solution”。

 

輸入輸出格式

輸入格式:

第一行, D1D1 , CC , D2D2 , PP , NN 。

接下來有 NN 行。

i+1i+1 行,兩個數字,油站i離出發點的距離 DiDi 和每升汽油價格 PiPi 。

輸出格式:

所需最小費用,計算結果四舍五入至小數點後兩位。如果無法到達目的地,則輸出“No Solution”。

對於這個問題,首先我們想到貪心的思路。在能到達的加油站中有兩種情況:1.選擇最近的並且油價比當前的加油站a油價低的加油站b,加油到恰能到達b,然後依次做下一步打算。

2.在能到達的加油站中 沒有比當前的油價更低,選擇油價相比最低的加油站,加滿油(註意是加滿油)前往該加油站,再依次做下一步打算。

若加滿油都不能到達其他加油站,則輸出“No Solution!”。

細節:

    終點看做·是第++n個加油站,並且油價設為-1(確保能到達目的地)。

  1 #include<cstdlib>
  2
#include<cstdio> 3 #include<algorithm> 4 #define debug 5 using namespace std; 6 int n; 7 double d1,c,d2; 8 struct oil 9 { 10 double d,p; 11 bool operator <(const oil &th)const 12 { 13 return d<th.d; 14 } 15 16 }a[100]; 17 double
res_u; 18 int main() 19 { 20 scanf("%lf%lf%lf%lf%d",&d1,&c,&d2,&a[0].p,&n); 21 #ifdef debug 22 printf("%lf %lf %lf %lf\n" ,d1,c,d2,a[0].p,n); 23 #endif 24 for(int i=1;i<=n;i++) 25 { 26 scanf("%lf%lf",&a[i].d,&a[i].p); 27 #ifdef debug 28 printf("i=%d,%.2lf %.2lf\n",i,a[i].d,a[i].p); 29 #endif 30 } 31 sort(a+1,a+1+n); 32 #ifdef debug 33 for(int i=1;i<=n;i++) 34 printf("---%.2lf--- ",a[i].d); 35 printf("\n"); 36 #endif 37 a[++n].d=d1; 38 39 a[n].p=-1; 40 int x=0; 41 double sum=0.0; 42 res_u=0; 43 while(x<n) 44 { 45 bool can=false; 46 bool cheap=false; 47 double w=a[x].d+c*d2; 48 int ans=10000000; 49 int k; 50 for(int i=x+1;(i<=n)&&(a[i].d<=w);i++) 51 { 52 can=true ; 53 54 if(a[i].p<=a[x].p) 55 { 56 cheap=true; 57 k=i; 58 break; 59 } 60 else 61 { 62 if(a[i].p<=ans) 63 { 64 ans=a[i].p; 65 k=i; 66 } 67 } 68 } 69 if(!can) 70 { 71 printf("No Solution"); 72 return 0; 73 } 74 75 if(cheap) 76 { 77 78 79 double fe=(a[k].d-a[x].d)/d2; 80 sum+=(fe-res_u)*a[x].p; 81 res_u=0; 82 x=k; 83 84 } 85 else 86 { 87 #ifdef debug 88 printf("沒找到便宜的:\n"); 89 #endif 90 sum+=(c-res_u)*a[x].p; 91 res_u=c-(a[k].d-a[x].d)/d2; 92 x=k; 93 #ifdef debug 94 printf("sum=%lf\n-------\n",sum); 95 #endif 96 97 } 98 99 } 100 printf("%.2lf",sum); 101 // system("PAUSE"); 102 return 0; 103 }

p1016旅行家的預算