P1180 驾车旅游
题目描述
如今许多普通百姓家有了私家车,一些人喜爱自己驾车从一个城市到另一个城市旅游。自己驾车旅游时总会碰到加油和吃饭的问题,在出发之前,驾车人总要想方设法得到从一个城市到另一个城市路线上的加油站的列表,列表中包括了所有加油站的位置及其每升的油价(如 3.253.253.25 元/L)。驾车者一般都有以下的习惯:
- 除非汽车无法用油箱里的汽油达到下一个加油站或目的地,在油箱里还有不少于最大容量一半的汽油时,驾驶员从不在加油站停下来;
- 在第一个停下的加油站总是将油箱加满;
- 在加油站加油的同时,买快餐等吃的东西花去 202020 元。
- 从起始城市出发时油箱总是满的。
- 加油站付钱总是精确到 0.10.10.1 元(四舍五入)。
- 驾车者都知道自己的汽车每升汽油能够行驶的里程数。
现在要你帮忙做的就是编写一个程序,计算出驾车从一个城市到另一个城市的旅游在加油和吃饭方面最少的费用。
输入格式
第一行是一个实数,是从出发地到目的地的距离(单位:km)。
第二行是三个实数和一个整数,其中第一个实数是汽车油箱的最大容量(单位:L);第二个实数是汽车每升油能行驶的公里数;第三个实数是汽车在出发地加满油箱时的费用(单位:元);一个整数是 111 到 505050 间的数,表示从出发地到目的地线路上加油站的数目。
接下来 nnn 行都是两个实数,第一个数表示从出发地到某一个加油站的距离(单位:km);第二个实数表示该加油站汽油的价格(单位:元)。
数据项中的每个数据都是正确的,不需判错。一条线路上的加油站根据其到出发地的距离递增排列并且都不会大于从出发地到目的地的距离。
输出格式
输出一个实数,即精确到 0.10.10.1 元的最小的加油和吃饭费用。
输入输出样例 #1
输入 #1
600
40 8.5 128 3
200 3.52
350 3.45
500 365
输出 #1
13133.2
C++实现
#include
#include
#include
#include
using namespace std;
int n;
double s,c,each,init,ans,km[55]={0},pr[55]={0};
void comp(int jyz,double money,double last){
if(jyz>n){
if(money<ans) ans=money;
}
else{
if(money>ans) return;//剪枝
else{
last-=(km[jyz]-km[jyz-1])/each;
if(last*each<km[jyz+1]-km[jyz]){
comp(jyz+1,money+20+pr[jyz]*(c-last),c);
}//必须加油
else if(last*2<c){
comp(jyz+1,money+20+pr[jyz]*(c-last),c);
comp(jyz+1,money,last);
}//可加可不加
else comp(jyz+1,money,last);//不加
}
}
}
int main(){
cin>>s>>c>>each>>init>>n;
ans=init;
km[n+1]=s;
for(int i=1;i<=n;i++){
cin>>km[i]>>pr[i];
ans+=pr[i]*c+20;
}
comp(1,init,c);
printf(“%.1lf”,ans);
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

被折叠的 条评论
为什么被折叠?



