打卡信奥刷题(948)用C++实现信奥 P1180 驾车旅游

P1180 驾车旅游

题目描述

如今许多普通百姓家有了私家车,一些人喜爱自己驾车从一个城市到另一个城市旅游。自己驾车旅游时总会碰到加油和吃饭的问题,在出发之前,驾车人总要想方设法得到从一个城市到另一个城市路线上的加油站的列表,列表中包括了所有加油站的位置及其每升的油价(如 3.253.253.25 元/L)。驾车者一般都有以下的习惯:

  1. 除非汽车无法用油箱里的汽油达到下一个加油站或目的地,在油箱里还有不少于最大容量一半的汽油时,驾驶员从不在加油站停下来;
  2. 在第一个停下的加油站总是将油箱加满;
  3. 在加油站加油的同时,买快餐等吃的东西花去 202020 元。
  4. 从起始城市出发时油箱总是满的。
  5. 加油站付钱总是精确到 0.10.10.1 元(四舍五入)。
  6. 驾车者都知道自己的汽车每升汽油能够行驶的里程数。

现在要你帮忙做的就是编写一个程序,计算出驾车从一个城市到另一个城市的旅游在加油和吃饭方面最少的费用。

输入格式

第一行是一个实数,是从出发地到目的地的距离(单位:km)。

第二行是三个实数和一个整数,其中第一个实数是汽车油箱的最大容量(单位:L);第二个实数是汽车每升油能行驶的公里数;第三个实数是汽车在出发地加满油箱时的费用(单位:元);一个整数是 111505050 间的数,表示从出发地到目的地线路上加油站的数目。

接下来 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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值