打卡信奥刷题(913)用C++信奥P1016[普及组/提高] [NOIP 1999 提高组] 旅行家的预算

P1016 [NOIP 1999 提高组] 旅行家的预算

题目描述

一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的)。给定两个城市之间的距离 D 1 D_1 D1、汽车油箱的容量 C C C(以升为单位)、每升汽油能行驶的距离 D 2 D_2 D2、出发点每升汽油价格 P P P和沿途油站数 N N N N N N 可以为零),油站 i i i 离出发点的距离 D i D_i Di、每升汽油价格 P i P_i Pi i = 1 , 2 , … , N i=1,2,…,N i=1,2,,N)。计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出 No Solution

输入格式

第一行, D 1 D_1 D1 C C C D 2 D_2 D2 P P P N N N

接下来有 N N N 行。

i + 1 i+1 i+1 行,两个数字,油站 i i i 离出发点的距离 D i D_i Di 和每升汽油价格 P i P_i Pi

输出格式

所需最小费用,计算结果四舍五入至小数点后两位。如果无法到达目的地,则输出 No Solution

输入输出样例 #1

输入 #1

275.6 11.9 27.4 2.8 2
102.0 2.9
220.0 2.2

输出 #1

26.95

说明/提示

N ≤ 6 N \le 6 N6,其余数字 $ \le 500$。

NOIP1999 普及组第三题、提高组第三题

C++实现

#include
#define re register
using namespace std;
int const MANX=9999;
int n,f;
double Ans=99999999,sum,c,dis;
double d[MANX],p[MANX],nd[MANX];
void dfs(int st,double oil,double mo){
if(st==n+1){
if(mo f=1;
return;
}
if(cdis double nx=0;
for(re int i=st;i<=n;i++){
nx+=nd[i];
if(dis
c dfs(i+1,c-nx/dis,mo+p[st]*(c-oil));
dfs(i+1,0,mo+max((double)0,p[st]*nx/dis-p[st]*oil));
}
return;
}
int main(){
cin>>sum>>c>>dis>>p[0]>>n;
for(re int i=1;i<=n;i++){
cin>>d[i]>>p[i];
nd[i-1]=d[i]-d[i-1];
}
nd[n]=sum-d[n];
dfs(0,0,0);
if(f){
printf(“%.2lf”,Ans);
}
else printf(“No Solution”);
return 0;
}

打卡信奥刷题(913)用C++信奥P1016[普及组/提高] [NOIP 1999 提高组] 旅行家的预算_第1张图片

后续

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

你可能感兴趣的:(C++,c++,开发语言,算法,青少年编程,数据结构)