首页 > 代码库 > P1016 旅行家的预算
P1016 旅行家的预算
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 2102.0 2.9220.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; //到达下一个站点时没油了,所以剩余汽油量清029 }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 else41 {42 printf("No Solution");43 return 0;44 }45 }46 }47 while(pos<=n);48 printf("%.2lf",cost);49 return 0;50 }
P1016 旅行家的预算
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。