题目描述
一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 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 }
原文地址:https://www.cnblogs.com/zxzmnh/p/9434299.html
时间: 2024-10-06 01:59:52